【问题标题】:Send data from master to detail view将数据从主视图发送到详细视图
【发布时间】:2013-10-21 06:42:04
【问题描述】:

您好,我是 iOS 编程新手,我的要求是将表格单元格文本发送到详细视图并在详细视图中显示该文本。

主视图

我已将这些视图控制器与segue 连接起来。我的主视图控制器正在使用以下函数在表格视图中添加数据。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    cell.textLabel.text = [_types objectAtIndex:indexPath.row];

    return cell;
}

之后,我使用以下函数将当前选定的表格视图单元格的文本分配给 1 个变量。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    _type = [_types objectAtIndex:indexPath.row];
}

为了将选定的表格视图单元格的数据传递给详细视图控制器,我使用了以下函数。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"CellSelection"])
    {
        CellSelectionViewController *controller = (CellSelectionViewController *)segue.destinationViewController;
        controller.msg = _type;
    }
}

详细视图

在详细视图中,我只是提醒从主视图发送的传递数据。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Test" message:_msg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}

现在我的问题是

  • 当我单击任何单元格时,它会加载详细视图但发送 null 值。
  • 当我返回并再次单击一个单元格时,它会发送我之前选择的值

有人知道这里有什么问题吗?

【问题讨论】:

    标签: ipad ios6 xcode4.5


    【解决方案1】:

    看起来你正在使用didSelectRowAtIndexPath 一个segue。您应该使用其中一种。所以,你可以:

    1. 您可以停用您的 didSelectRowAtIndexPath 方法,然后使用 prepareForSegue

      - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
      {
          if ([segue.identifier isEqualToString:@"CellSelection"])
          {
              CellSelectionViewController *controller = (CellSelectionViewController *)segue.destinationViewController;
              controller.msg = [_types objectAtIndex:[self.tableView indexPathForSelectedRow].row];
          }
      }
      
    2. 或者,您可以将 segue 从表格视图单元格中移除到下一个场景,而是将其定义在两个视图控制器之间,给它一个标识符,然后在您的属性设置后让didSelectRowAtIndexPath 调用它:

      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      {
          _type = [_types objectAtIndex:indexPath.row];
      
          [self performSegueWithIdentifier:@"yoursegueidhere" sender:@"self];
      }
      

    但不要同时拥有来自单元格的 segue 和 didSelectRowAtIndexPath 方法。您无法保证它们将执行的顺序。我倾向于采用第一种方法并完全退休didSelectRowAtIndexPath

    【讨论】:

    • 感谢您的回答。我会检查并告诉你结果。
    • 非常感谢。你的第一种方法成功了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多