使用表视图作为选择器

时间:2012-08-14 05:26:46

标签: objective-c cocoa-touch uitableview uiviewcontroller

在我的iOS应用程序中,我有一个视图控制器来处理我的主视图。如果我在该视图上有一个按钮,我可以打开一个模态表视图,这样用户可以从表中选择一行,然后主视图上的标签等于所选的行文本吗?

3 个答案:

答案 0 :(得分:1)

就这样做

向您的视图控制器添加一个tableview,创建一个到表视图的对象。

然后这样做

- (void)viewDidLoad
{
[super viewDidLoad];
 tableViewObj.hidden = YES;
array = [[NSArray alloc]initWithObjects:@"label1",@"label2",@"label3",@"label4", nil];  
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
displayText.text = [array objectAtIndex:indexPath.row];
tableViewObj.hidden = YES;
}

-(IBAction)gotoBack:(id)sender
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:tableViewObj cache:YES];
[UIView commitAnimations];
tableViewObj.hidden = NO;
}

我想可能对你有用

答案 1 :(得分:0)

当然,这是可能的。您可以使用presentViewController:animated:completion:方法来呈现模态表视图控制器。主视图控制器有一个属性,presentsViewController,它允许您访问该控制器(您正在呈现的那个),因此您可以获取其中一个属性的值(将设置为所选行的文本)。 / p>

编辑后:

你可以这样做。在呈现视图中,控制器具有:

在init方法(或viewDidLoad)中注册以接收此行的通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissAndUpdate:) name:@"ItemSelectedNotification" object:nil];

然后是这两种方法:

 -(IBAction)buttonClick:(id)sender {
    RDTableViewController *tvc = [[RDTableViewController alloc] initWithStyle:UITableViewStylePlain];
    [self presentViewController:tvc animated:YES completion:nil];
}


-(void)dismissAndUpdate:(NSNotification *) aNotification {
    self.label.text = [aNotification.userInfo valueForKey:@"selectedText"];
    [self dismissModalViewControllerAnimated:YES];

}

这是一个可以在表视图控制器子类中完成的示例:

@implementation RDTableViewController

- (id)initWithStyle:(UITableViewStyle)style {
    if (self = [super initWithStyle:style]) {
        self.theData = @[@"one",@"two",@"three",@"foour",@"five",@"six"];
    }
    return self;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.theData.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"NewCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"NewCell"];
    }
    cell.textLabel.text = [self.theData objectAtIndex:indexPath.row] ;
    return cell;
}

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSDictionary *dict = [NSDictionary dictionaryWithObject:[self.theData objectAtIndex:indexPath.row] forKey:@"selectedText"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ItemSelectedNotification" object:self userInfo:dict];
}

答案 2 :(得分:0)

You can handle those values by using UITableViewDelegate methods . By getting the selectedIndex path value set the text to Button.<br/>

  #import <UIKit/UIKit.h>


@interface MainView : UIViewController
{
    IBOutlet UIButton *mainButton;

}  
 @property(nonatomic,retain)IBOutlet UIButton *mainButton;

//in MainView.m file 
@synthesize mainButton;



 //in CustomViewController.h file 
     #import "MainView.h"
    #import <UIKit/UIKit.h>

    @interface CustomViewController :UIViewController<UITableViewDelegate,UITableViewDataSource> {

     IBOutlet UITableView *tableList;

    }


    //in .m file 

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
     //Pass the indexPath.row to mainView
    if (indexPath.row==0) {
MainView *mainV = [[MainView alloc]initWithNibName:@"MainView" bundle:nil];
            mainV.mainButton.text=@"setMainButtonText";
            [self.navigationController pushViewController:mainV animated:YES];

    }
  ///By using indexPath you can set that value ..


    }