将 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 时更改视图控制器

如何将子视图添加到另一个视图控制器?

bar button item segue 不在下一个视图顶部添加导航栏

以编程方式将系列添加到 OxyPlot 图表:没有显示

添加到可变数组的对象数量不正确

将按钮添加到视图