iOS 6将数据从TableView传递到Detail View

时间:2013-09-08 15:48:30

标签: iphone ios objective-c uitableview storyboard

我有一个包含一些行的表视图,每行都有其详细信息披露按钮。 我希望当用户点击该按钮时,会出现另一个表视图(由故事板定制)并显示一些相关数据。

来自TableViewController.m

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {

    DetailViewController *detailViewController = [[detailViewController alloc] init];
    //creating a parse object
    PFObject *checkin = [_dataSourceArray objectAtIndex:indexPath.row];
    //getting data i want
    NSString *trainNumb = [checkin objectForKey:@"trainNumber"];
    //passing the data
    detailViewController.trainNumber = trainNumb;   
}

来自DetailTableViewController.m

- (void)viewDidLoad {
    [_trainNumberLabel setText:_trainNumber];
}

问题是在DetailTableView中NSString结果为空。

我在这里缺少什么?谢谢!

1 个答案:

答案 0 :(得分:1)

如果此代码实际编译,这可能是您的问题:

DetailViewController *detailViewController = [[detailViewController alloc] init];

应该是:

DetailViewController *detailViewController = [[DetailViewController alloc] init];

但是你首先不应该是alloc/initing你的视图控制器。在Interface Builder中自定义视图控制器时,如果需要这些自定义,则必须像这样实例化它:

[self.storyboard instantiateViewControllerWithIdentifier:@"MyStoryboardIdentifier"]`

您必须将控制器的故事板ID设置为“MyStoryboardIdentifier”或您要使用的任何标识符。

另外,正如您在评论中指出的那样,您有一个时间问题:在设置列车编号之前,您的详细控制器的viewDidLoad会运行。更好的方法是确保无论顺序如何都能正常工作:

- (void)updateTrainNumberLabel
{
    self.trainNumberLabel.text = self.trainNumber;
}

- (void)setTrainNumber:(NSString *)trainNumber
{
    _trainNumber = trainNumber;
    [self updateTrainNumberLabel];
}

- (void)viewDidLoad
{
    ...
    [self updateTrainNumberLabel];
}

换句话说,您可以使用单独的方法配置标签,在本例中为updateTrainNumberLabel,并且当可能影响标签的任何内容发生时,例如视图加载或更改的数字,您调用方法。