将数据从主视图发送到详细视图

时间:2013-10-21 06:42:04

标签: ipad ios6 xcode4.5

您好我是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 值。
  • 当我返回并再次点击一个单元格时,它会发送我之前选择的值

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

1 个答案:

答案 0 :(得分: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];
    }
    
  3. 但是没有来自单元格的segue和didSelectRowAtIndexPath方法。您无法保证他们的执行顺序。我倾向于采用第一种方法并完全退出didSelectRowAtIndexPath