我在 UITableView 中有 5 个单元格。每个都有一个 UITextField 作为子视图,用户将在其中输入数据。如果我确实使用单元格重用,那么如果单元格被滚动出视图,则文本字段将被清除。我不想处理这个。有没有办法不重用单元格,这样我就没有这个问题,如果有,怎么办?
这是一个坏主意吗?
我在 UITableView 中有 5 个单元格。每个都有一个 UITextField 作为子视图,用户将在其中输入数据。如果我确实使用单元格重用,那么如果单元格被滚动出视图,则文本字段将被清除。我不想处理这个。有没有办法不重用单元格,这样我就没有这个问题,如果有,怎么办?
这是一个坏主意吗?
我在我的一个应用程序中具有相同的功能,我使用下面的代码来实现这一点,我从来没有遇到过这种问题。
首先,您需要将所有 textField 值临时存储在 Array 中。像这样制作数组。
arrTemp=[[NSMutableArray alloc]initWithObjects:[NSString stringWithFormat:@""],
[NSString stringWithFormat:@""],
[NSString stringWithFormat:@""],
[NSString stringWithFormat:@""],
[NSString stringWithFormat:@""],
[NSString stringWithFormat:@""],
[NSString stringWithFormat:@""],
[NSString stringWithFormat:@""],
[NSString stringWithFormat:@""],nil];
然后给所有 textField tag = indexPath.row;
之后,您需要在以下两种方法中替换 textField 值。
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[arrTemp replaceObjectAtIndex:textField.tag withObject:textField.text];
}
-(void)textFieldDidEndEditing:(UITextField *)textField{
[arrTemp replaceObjectAtIndex:textField.tag withObject:textField.text];
}
最后,您需要在 cellForRowAtIndexPath 数据源方法中设置该值。因此,每当用户滚动 tableview 时,它都会从临时数组中设置先前的值。像这样。
cell.txtEntry.text = [arrTemp objectAtIndex:indexPath.row];
我可能忘记了一些要粘贴在这里的代码。因此,如果您有任何问题,请告诉我。
您可以给每个单元格一个唯一的 ReuseIdentifier,也许通过将 indexPath.row 附加到名称。如果您只有 5 个单元格,这可能会很好,但您将失去UITableView
. 在这种情况下,您可能希望使用 aUIScrollView
代替。
我会说 5 个 textview 是一个完美的案例,不需要对单元进行排队和出队,只需在视图中创建它们并加载、存储在数组中并按要求返回。
如果您打开Apple 的 Recipes 示例应用程序,您将看到 Apple 如何使用 xib 文件来加载 UITableViewCells。
在 IngredientDetailViewController 文件中:
@property (nonatomic, assign) IBOutlet EditingTableViewCell *editingTableViewCell;
// ...
[[NSBundle mainBundle] loadNibNamed:@"EditingTableViewCell" owner:self options:nil];
// this will cause the IBOutlet to be connected, and you can now use self.editingTableViewCell
虽然看起来他们正在重用单元格,但您可以使用相同的方法将 5 个单元格加载到 5 个单独的 IBOutlets 中,然后在 cellForRowAtIndexPath 中,您只需返回这 5 个,而不是调用 dequeue 方法。
注意:您可能需要将单元格存储为strong
属性(而不是设置assign
它们)。