在ios中维护附件视图的状态

Posted

技术标签:

【中文标题】在ios中维护附件视图的状态【英文标题】:Maintain state of Accessory view in ios 【发布时间】:2013-05-22 10:38:11 【问题描述】:

我有一个动态表,用户可以在其中添加和删除数据。该表显示购物清单。如果购物完成,用户应该能够勾选所需的项目并且也应该能够取消勾选,我通过设置附件按钮来实现这一点。但是,当我从中删除一行时,问题就来了,单元格被删除,但是附加到该单元格的附件按钮保持在相同的状态。

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

  cell = [tableView cellForRowAtIndexPath:indexPath]; 
   if (cell.accessoryView == nil)
       
    cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]];  else  cell.accessoryView = nil; 
   

【问题讨论】:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath cell = [tableView cellForRowAtIndexPath:indexPath]; if (cell.accessoryView == nil) cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; else cell.accessoryView = nil; 【参考方案1】:

因为UITableView 通常重用UITableViewCell 的实例,所以您必须确保您的'-tableView:cellForRowAtIndexPath: 方法正确设置单元格的所有属性。其他陈旧的数据可能会持续存在。我猜这可能是您的问题,没有完整地查看您的代码。

所以,是这样的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString*    cellIdentifier = @"TheCellIdentifier";
    UITableViewCell*    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    

    ShoppingObject* shopping = [self.myShoppingList objectAtIndex:indexPath.row];
    UIImageView*    accessoryView = nil;

    if (shopping.isDone) 
        accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]];
    

    cell.accessoryView =  accessoryView;

    return cell;

它通过重用缓存或创建一个新缓存来获取单元。然后它会检查您的数据模型的状态,以查看该行中表示的对象是否已完成购物,如果购物已完成,则会为您提供图像。请注意,购物还没有完成,没有创建 accessoryView,因此无论 ShoppingObject 的状态在该表行中表示什么,该单元格的 accessoryView 都将正确设置。

所以我可能会在你的-tableView:didSelectRowAtIndexPath: 中做的只是简单地将-reloadData 放在桌子上以确保所有内容都正确更新。

【讨论】:

好吧,没有一种方法可以检查购物是否完成,如果他/她完成了购物清单中提到的任务,用户可以选择打勾。我的意思是我无法确定要显示的刻度,它需要在选中行时显示。 那么什么是跟踪您的数据? GUI 本身? 用户可以在他的列表中添加 n 删除随机的东西。我他已经完成了购物,他/她应该能够在上面打勾。 这很好,但是什么会跟踪列表中的内容? UITableView GUI 本身?你有某种数据模型吗?我会假设您这样做,因为我认为您允许他们输入类似任务名称的内容。为什么该对象不跟踪其余的数据状态,例如任务是否完成?无论如何,重点仍然存在:您需要确保 cell.accessoryView 始终在 -tableView:cellForRowAtIndexPath: 中进行相应设置,因为很可能该单元格正在被重用,并且该特定单元格实例具有您没有清除的“陈旧”数据. 我如何删除这个“陈旧的单元格”【参考方案2】:

您需要跟踪所选项目

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

  cell = [tableView cellForRowAtIndexPath:indexPath]; 
   if (cell.accessoryView == nil)
       
    cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; 
    [self.checkedIndexPaths addObject:indexPath];
    
   else  
   cell.accessoryView = nil; 
   [self.checkedIndexPaths removeObject:indexPath];
   

   

编辑

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 


// Do other stuffs

cell.accessoryView = nil;

if ([self.checkedIndexPath containsObject:indexPath]) 
   cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; 
    


【讨论】:

checkIndexPath 是什么? 只是一个 NSMutaleArray 来存储 selectedItems 的 indexPath 在for循环之前..将单元格附件视图设置为nil.. cell.accessoryView = nil @anil...尝试使用这个...但是当我删除一行时,所有附件视图都变为 nil..! 你如何声明checkedIndexPath数组..检查数组是否正在释放?当你删除一行 cellForIndexPath 会调用对吗?在accessoryView检查部分放一个断点并进行检查

以上是关于在ios中维护附件视图的状态的主要内容,如果未能解决你的问题,请参考以下文章

IOS 使用输入附件视图切换预测文本视图

带有附件视图的 iOS 8 自调整单元格

iOS 7 对附件视图和附件类型的布局不同?

如何创建具有适当不透明度的 UITextField 附件视图 iOS7,甚至复制键?

iOS 11 键盘和附件视图之间的额外空间

iOS7 附件视图中的背景颜色错误