1

嗨,我是 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];
}

现在我的问题是

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

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

4

1 回答 1

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完全退休。

于 2013-10-21T07:09:07.323 回答