将 Button 添加到一个不变的可变表视图
Posted
技术标签:
【中文标题】将 Button 添加到一个不变的可变表视图【英文标题】:Adding Button to a constant changeable table view 【发布时间】:2015-04-17 08:24:31 【问题描述】:我有一个表格视图,只要找到新的外围设备就会重新加载。 我在每个单元格上都有一个按钮。此按钮允许将外围设备添加到阵列。现在添加按钮后,我想将其更改为取消,这就是我所做的。这里的问题是,表总是重新加载,因此按钮总是返回到初始状态(ADD)。 请问有什么解决办法吗?
【问题讨论】:
【参考方案1】:您的表格单元格应反映数据模型中项目的状态。每次重新加载表格时,由于表格视图通过其委托请求单元格,因此您应该使用反映当前状态所需的信息来设置每个单元格。听起来您只是在跟踪活动单元格中的状态,而不是在数据模型中保持整体状态。
所以当表格视图询问给定 indexPath 的单元格时:
1) 为请求的 indexPath 出列一个单元格。
2) 设置单元格,使其知道数据模型的哪个部分是视图。单元格中的显示/按钮应反映数据模型中的内容。
3) 在您的按钮中,使目标操作更新数据模型而不是单元格。
4) 如果单元格中的按钮更改了数据模型,则仅重新加载该行而不是整个表。重新加载该行将导致表格要求一个新的单元格,该单元格现在将反映您的数据模型。
这将使您的单元格不受表格重新加载的影响,因为您现在可以正确跟踪状态。
【讨论】:
是的,我向外围设备添加了一个布尔类型的新属性。每当我按下按钮时,我使用选定的索引从数组中提取外围设备,然后我从该数组中删除对象并在同一索引处重新添加更新的对象,然后重新加载表。【参考方案2】:在您的tableView:cellForRowAtIndexPath:
中执行此操作
if ([self.arrayOfPeripherals containsObject:peripheralForCell])
[cell.button setTitle:@"Cancel" forState:UIControlStateNormal];
else
[cell.button setTitle:@"Add" forState:UIControlStateNormal];
self.arrayOfPeripherals
是您的外设阵列,
peripheralForCell
是 indexPath 处单元格的数据对象
【讨论】:
【参考方案3】:这里我假设您将pheripheral
存储到NSMutableArray
。一旦找到新的外设,您就将其添加到您的NSMutableArray
。执行此操作时,您需要将 isPheripheralAdded
密钥与每个 pheripheral
内容一起存储。
isPheripheralAdded
具有 boolean
类型。
对于所有 pheripheral
包含,初始 isPheripheralAdded
标志是 False
。一旦用户点击Add
按钮。 isPheripheralAdded
标志更新为True
并更新NSMutableArray
中选定的索引内容。
现在您拥有的 isPheripheralAdded = True
仅适用于您添加的那些人。其他有isPheripheralAdded = False
。
现在reload table
,在cellForRowAtIndexPath
中添加以下代码。
if (isPheripheralAdded == True)
[cell.button setTitle:@"Cancel" forState:UIControlStateNormal];
else
[cell.button setTitle:@"Add" forState:UIControlStateNormal];
希望对您有所帮助。
【讨论】:
【参考方案4】:我建议您创建一个对象并将对象插入到您的数组中(如果您还没有这样做的话)。然后为这个对象创建一个BOOL showCanceled
。添加外围设备后,立即更改该对象(在为 TableView 加载的数组上)并设置 showCanceled = YES
。当您加载 TableView 时,检查 showCanceled 的状态并进行设置。
if (showCanceled == YES)
[cell.button setTitle:@"Cancel" forState:UIControlStateNormal];
else
[cell.button setTitle:@"Add" forState:UIControlStateNormal];
【讨论】:
以上是关于将 Button 添加到一个不变的可变表视图的主要内容,如果未能解决你的问题,请参考以下文章
在 didSelectRowAtIndexPath 时更改视图控制器