0

我的 MainViewController 中有一个 UITableView。当用户点击一个单元格时,

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

selectedRow = indexPath;

....

[self performSegueWithIdentifier:@"OtherViewControllerSegue" sender:self];
}

然后它们被带到另一个 UIViewController(我们称之为 OtherViewController)。在 OtherViewController 中,设置了所选单元格的名称。当 OtherViewController 被关闭时,它会使用新名称更新 MainViewController 中的单元格:

[[[mainvc.myTableView cellForRowAtIndexPath:mainvc.selectedRow] textLabel] setText:namecell.textField.text];
    [self.navigationController popViewControllerAnimated:YES];

这一切都很好,直到我有更多的单元格超出了屏幕的容量。如果单元格的数量超出了屏幕的容量(iPhone 为 8 个,iPad 为 16 个),那么这也会分别为每第八个或第十六个单元格设置名称。关于我做错了什么的任何想法?

更新:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [pointsTableView dequeueReusableCellWithIdentifier:@"myTableCell"];
return cell;
}
4

4 回答 4

2

您正在尝试将数据(新名称)存储在视图(单元格的标签)中。可能发生的情况是,当您在数据源的cellForRowAtIndexPath方法中重复使用单元格时,其中一些已经为它们设置了此文本并且它仍然存在。

更好的想法是在您用作单元格信息的任何数组中进行更改,然后重新加载表格视图以使更改可见。

于 2012-06-30T19:05:49.863 回答
2

这是由于单元重用,并且您将模型视图混合在一起(在 MVC 上下文中)。

表格单元格是一个短暂的东西,一旦它离开屏幕,它就会在需要另一个单元格时被重用(而不是创建新的单元格)。这就是该dequeueReusableCellWithIdentifier:方法的作用。

这意味着您不能在其中存储数据并期望它在以后仍然有效。在此示例中,您尝试将名称存储在表格单元格中。在任何视图对象上设置属性(如标签文本)的原因纯粹是为了显示,而不是为了存储。因此,要解决这个问题,您应该在模型中维护一个对象列表(例如,这可以在单独的类中或在mainvc对象的数组中)。然后,cellForRowAtIndexPath:您应该每次都设置标签文本 - 即使不应该有标签,您也需要将其设置为 nil 或空字符串,因为单元格被重复使用,它可能包含上次使用时的内容。

更新:cellForRowAtIndexPath:您应该使用控制器中的方法或属性在模型中设置文本,然后告诉表格视图重新加载该单元格, 而不是调用您自己并设置其文本。代码可能如下所示:

// This code is in where you want to set the text from
[mainvc setText:someText forIndexPath:indexPath];

..并在您的主视图控制器中:

- (void)setText(NSString*)newText forIndexPath:(NSIndexPath*)indexPath
{
    // Store the text in your model here...
    ...

    // If the view is loaded, the table view should reload the cell.
    if(self.isViewLoaded)
    {
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

然后表格视图将调用cellForRowAtIndexPath:正确设置文本的位置。起初这可能看起来有点令人费解,但是当您习惯使用模型-视图-控制器设计模式时,您会发现像这样保持每个 MVC 组件的工作分开意味着您的代码更整洁、更易于理解、更少的错误,更容易更新/扩展等。

于 2012-06-30T19:11:08.323 回答
0

我想,你不应该cellForRowAtIndexPath自己打电话。可以调用它来创建单元格,而不是更改它。例如,您可以通过委托将所需的字符串传递给第一个视图来更新表。在事件中(用户设置名称),您可以更新所有表格并将所需的名称设置为单元格。

于 2012-06-30T19:04:04.723 回答
0

很难确切地说出问题所在,但一种可能的解决方案可能是:

确保在 cellForRowAtIndexPath 中初始化单元格,如下所示:

// Create the Cell
    static NSString *recordCell = @"pickerTableCell";
    cell = [tableView dequeueReusableCellWithIdentifier:recordCell];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:recordCell];
    }

我知道这主要是一种记忆解决方案,但也可能在这里出现。

此外,请查看您的代码并检查您如何确定哪个单元格被重命名。您可能会不小心在多个单元格上调用重命名而没有意识到

于 2012-06-30T19:04:56.973 回答