目标C:在控制器

时间:2015-09-17 02:35:40

标签: ios objective-c

我想将一些变量从我的ViewController传递到我的TableViewController,在那里可以显示它们。例如,假设我想传递一个字符串firstName:

ViewController.m

- (IBAction)addToListPressed:(id)sender {
    TableViewController *tableController = [[TableViewController alloc] init];
    tableController.firstName = @"Alice";
    [self.navigationController pushViewController:tableController animated:YES];  
}

TableViewController.h

@interface TableViewController : UITableViewController

@property NSString *firstName;

@end

TableViewController.m

- (void)viewDidLoad {
     [super viewDidLoad];
     NSLog(@"First name: %@", self.firstName);
}

我得到的输出是名字:(null)如何正确访问名称?

2 个答案:

答案 0 :(得分:0)

最终更新

我实际上已将您的代码添加到我的项目中,因为我很好奇,并且它运行没有问题。我把它包含在github项目中注释掉了。享受!

更新

我在这里创建了一个github repo:https://github.com/Rnorback/sample-segue-code,它将向您展示如何为将来设置viewcontroller和tableview。

我将此代码添加到ViewController.m:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    if ([segue.identifier isEqualToString:@"tableViewSegue"]) {
        TableViewController *tableVC = [segue destinationViewController];
        tableVC.firstName = @"Alice";
    }
}

我将此代码添加到ViewController.m中的按钮操作:

[self performSegueWithIdentifier:@"tableViewSegue" sender:self];

要设置此项目,我完全按照以下描述进行操作:

在故事板中设置以下板: enter image description here

确保它们与身份检查器中的两个类相关联: enter image description here

enter image description here

然后在它们之间进行控制 - 拖动以创建一个segue并选择show: enter image description here

最后,在属性检查器中命名segue: enter image description here

如果有帮助,请告诉我。

答案 1 :(得分:-1)

如果您不打算允许外部课程阅读您的表格视图的名字,请将其移到实施文件中,如下所示:

<强> TableViewController.m

@interface TableViewController ()

@property (nonatomic, strong) NSString *firstName;

@end


- (id)initWithFirstName:(NSString *)iFirstName {
    if (self = [super init]) {
        self.firstName = iFirstName;
    }

    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"First name: %@", self.firstName);
}

然后像这样打电话给你TableViewController

- (IBAction)addToListPressed:(id)sender {
    TableViewController *tableController = [[TableViewController alloc] initWithFirstName:@"Alice")];
    [self.navigationController pushViewController:tableController animated:YES];
}

编辑:发表评论

我相信这是关于在内存中加载正确对象的全部内容。如果你是通过故事板进行的,那么从你的视图控制器(点按按钮时传递名字)将segue拖到你的UITableViewController。请看一下这个Apple Documentation如何在故事板中做到这一点。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    TableViewController *myTableController = (TableViewController *)segue.destinationViewController;
    myTableController.firstName = @"Alice";
}

然后不要像我之前建议的那样实现initWithFirstName:方法。让你的TableViewController.h看起来像这样。

@interface TableViewController : UITableViewController

@property (nonatomic, strong) NSString *firstName;

@end