Iphone UITableView每八个单元格重命名一次

Iphone UITableView每八个单元格重命名一次,iphone,ios,uitableview,Iphone,Ios,Uitableview,我在MainViewController中有一个UITableView。当用户点击单元格时 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { selectedRow = indexPath; .... [self performSegueWithIdentifier:@"OtherViewControllerSegue" sender:self]; }

我在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;
}

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

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

很难说到底是什么问题,但一种可能的解决方案可能是:

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

// Create the Cell
    static NSString *recordCell = @"pickerTableCell";
    cell = [tableView dequeueReusableCellWithIdentifier:recordCell];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:recordCell];
    }
// This code is in where you want to set the text from
[mainvc setText:someText forIndexPath:indexPath];
我知道这主要是一个内存解决方案,但可能也会在这里出现问题


另外,检查代码并检查如何确定重命名哪个单元格。您可能会意外地在多个单元格上调用重命名,而没有意识到这一点

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

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

// Create the Cell
    static NSString *recordCell = @"pickerTableCell";
    cell = [tableView dequeueReusableCellWithIdentifier:recordCell];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:recordCell];
    }
// This code is in where you want to set the text from
[mainvc setText:someText forIndexPath:indexPath];
我知道这主要是一个内存解决方案,但可能也会在这里出现问题


另外,检查代码并检查如何确定重命名哪个单元格。您可能无意中调用了多个单元格上的重命名,而没有意识到它

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


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

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


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

这是由于单元格重用,并且您将模型与视图混为一谈(在MVC上下文中)

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

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

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

// Create the Cell
    static NSString *recordCell = @"pickerTableCell";
    cell = [tableView dequeueReusableCellWithIdentifier:recordCell];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:recordCell];
    }
// 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];
    }
}

然后,表视图将调用
cellforrowatinexpath:
,在其中正确设置文本。一开始这看起来有点复杂,但是当你习惯于使用模型-视图-控制器设计模式时,你会发现像这样将每个MVC组件的作业分开意味着你的代码更整洁,更容易理解,有更少的bug,更容易更新/扩展,等等。

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

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

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