防止 UITableViewCells 出队并重新加载
Posted
技术标签:
【中文标题】防止 UITableViewCells 出队并重新加载【英文标题】:Prevent UITableViewCells from dequeue and reload 【发布时间】:2014-07-27 10:53:05 【问题描述】:我目前正在制作一个显示用户个人资料的应用。为此,我为不同类型的数据(电话号码、邮件地址等)使用了带有自定义单元格的 UITableViewCell。每个配置文件最多有 8 个单元格。
允许用户以最简单的方式编辑其个人资料。当 tableview 的编辑模式被触发时,所有可编辑的标签都被 textfields 替换。修改完成后返回标签。
Homever,不可见的单元格似乎有问题。每次它们重新出现在视图中时,它们都会重新加载,再次触发 setEditing:YES 方法等等......因此,在文本字段中所做的每一次更改都会丢失。
有没有办法阻止 tableview 删除不可见的单元格并将它们添加回来?只有八个单元格,因此不会占用太多资源,而且我不必在每次进行更改时都保存它们的状态。
PS:我已经用 dequeueReusableCellWithIdentifier 方法和每个单元格的标识符尝试了几件事,但我没有设法实现我想要的。每次我隐藏一个单元格时,它的内容都会刷新。
【问题讨论】:
更可靠的方法是只保存单元格的状态。 【参考方案1】:您应该使用静态单元格而不是动态单元格。选择表格视图并更改配置,如图像。
并在界面生成器中添加单元格!
【讨论】:
我只使用自定义单元格来重现标准联系人视图,而且似乎我没有使用 UITableViewController(但我无法说出原因)。所以我认为我不能更改“动态原型”选项。【参考方案2】:在这种情况下,UITableView 的可重用性对您没有帮助(在大多数情况下,可重用性当然是一件好事),但在保留编辑时会遇到很多困难。因此,您可以避免重复使用并提前准备好您的细胞。
在您的 ViewController 中添加 NSMutableArray
iVar 或属性
@property (nonatomic, strong) NSMutableArray *cells;
在您的 viewDidLoad 中:准备您的 cells
而不使用任何 reuseIdentifier
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
//Creates tableView cells.
[self createCells];
- (void)createCells
self.cells = [NSMutableArray array];
TCTimeCell *cellCallTime = [[TCTimeCell alloc] initWithTitle:@"CALL" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeCall];
[_cells addObject:cellCallTime];
TCTimeCell *cellLunchOut = [[TCTimeCell alloc] initWithTitle:@"LUNCH START" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeLunchOut];
[_cells addObject:cellLunchOut];
TCTimeCell *cellLunchIn = [[TCTimeCell alloc] initWithTitle:@"LUNCH END" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeLunchIn];
[_cells addObject:cellLunchIn];
TCTimeCell *cellSecondMealOut = [[TCTimeCell alloc] initWithTitle:@"2ND MEAL START" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeSecondMealOut];
[_cells addObject:cellSecondMealOut];
TCTimeCell *cellSecondMealIn = [[TCTimeCell alloc] initWithTitle:@"2ND MEAL END" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeSecondMealIn];
[_cells addObject:cellSecondMealIn];
TCTimeCell *cellWrapTime = [[TCTimeCell alloc] initWithTitle:@"WRAP" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeWrap];
[_cells addObject:cellWrapTime];
你可以从这个数组中填充你的 tableView。
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return self.cells.count;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
return self.cells[indexPath.row];
如果你有一个分段的 tableView,你可以准备你的单元格为array of arrays
。在这种情况下,您的数据源方法应如下所示
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
return [self.cells count];
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [self.cells[section] count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
return self.cells[indexPath.section][indexPath.row];
【讨论】:
你确定它真的能解决问题吗?如果每次单元格重新出现时调用 cellForRowAtIndexPath ,单元格数组将包含原始单元格还是修改后的单元格?隐藏时会保存单元格状态吗?我会按照你说的做,因为无论如何这可能是一种更简洁的方法,如果将单元格内容存储为实例变量,则访问和保存单元格内容会更容易。 当然可以。单元格数组始终包含显示和正在修改的单元格。尽管它在 tableView 中可见,但它将保留所有编辑。它是通常的 NSArray 功能。以上是关于防止 UITableViewCells 出队并重新加载的主要内容,如果未能解决你的问题,请参考以下文章