【问题标题】:iOS 6 pass data from TableView to Detail ViewiOS 6 将数据从 TableView 传递到 Detail View
【发布时间】:2013-09-12 04:41:16
【问题描述】:

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

来自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 结果为空。

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

【问题讨论】:

  • 添加断点和 NSLog 来调试代码怎么样?
  • 你确定在 TableViewController.m 中它不会导致 null
  • 是的,在带有 NSLog 的表视图控制器中,我可以看到正确的值!
  • 我尝试将 NSLog 放入两个文件中。我可以看到,DetailTableViewController 的 viewDidLoad 中的 NSLog 是在 TableViewController 的附件ButtonTappedForRowWithIndexPath 内的 NSLog 之前打印的。怎么可能?

标签: iphone ios objective-c uitableview storyboard


【解决方案1】:

如果这段代码真的可以编译,这可能是你的问题:

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

应该是:

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

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

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

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

此外,正如您在 cmets 中所指出的,您遇到了时间问题:您的详细控制器的 viewDidLoad 在您设置列车号之前运行。更好的方法是确保无论顺序如何都能正常工作:

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

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

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

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

【讨论】:

  • +1 用于在 nil 上捕获 alloc init。故事板建议是很好的建议,但仍然可以分配/初始化一个 vc,例如,从一个 nib。如果要使用故事板,还值得一提的是 segues。
  • 是的。我的意思是如果你想要自定义故事板,你必须使用instantiateViewControllerWithIdentifier
  • 这是我的错字,在我的 Xcode 中是 Detail!我也放了instanceViewControllerWithIdentifier而不是alloc init,但没有任何改变。
  • 没有任何改变,因为您还有其他问题。但是在这种情况下你绝对必须使用instantiateViewControllerWithIdentifier,否则它永远不会起作用。
  • 我根据您的一些 cmets 扩展了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
相关资源
最近更新 更多