根据按下的警报视图按钮更新UITableViewCell

时间:2013-10-12 03:16:22

标签: uitableview uibutton uialertview

我有自定义单元格的tableview。每个单元格都包含一个按下的按钮,提示提示。

警报按预期使用UIAlertView委托,并检查按钮的标题以确定用户按下的内容。这反过来调用提交数据的Web服务。提交完成后,我需要将该单元格中的按钮更改为另一个按钮图像。

重新加载数据,使其反映发送到服务器的更新,然后重新加载tableview无效。

有没有办法访问cellForRowAtIndexPath之外的单元格?我根据我按下的按钮设置了一个名为selectedIndex的全局变量,但这是我能得到的。以这种方式访问​​单元格是否合理(或者是个好主意)。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

UITableView有一个名为-cellForRowAtIndexPath:的方法(不是委托方法)。如果单元格仍然可见,并且您已关闭索引路径,则可以使用它来获取单元格。如果单元格不可见,它将返回nil(但在这种情况下,稍后将调用委托方法,以便在该索引路径变为可见之前再次为该索引路径提供单元格,因此您可以对其进行配置)。

需要注意的是,Web服务调用可能是异步的,当用户按下按钮并获得Web响应时,很多事情都会发生变化。用户可能已将屏幕上的单元格滚动,使其不再可见,在这种情况下,您需要以某种方式存储更新的值,以便稍后可以正确配置单元格。此外,如果您的代码因任何原因调用reloadData,即使保留NSIndexPath也没有任何意义 - 如果您的基础模型完全发生了变化,那么与用户点击相关联的模型记录现在可能处于完全不同的NSIndexPath(或者可能是根本不存在于数据集中)。根据您的情况,这些可能是或可能不是问题,但如果是,则最好保留对所选记录(或该记录的主键)的引用,以及何时通话返回,确定现在该记录的索引路径是什么,并查看该索引路径的单元格是否可见。

最后,我建议使用视图控制器的属性来存储这些值,而不是全局变量。如果您创建了视图控制器的新实例,并且您根据全局变量的值更改了行为,则可能仍然可以使用该视图控制器类的先前用法进行设置(具有完全伪造的值)。

答案 1 :(得分:0)

有很多方法可以在tableview中重新加载数据。但是对于你的情况,如果你可以获得对单元格的引用,那么做一些与UI相关的更改就足够了(更改图像或类似的东西)。

如果您认为在Web服务返回响应后您的表的内容大小会发生变化,那么您必须重新加载该表。当然,你可以重新加载整个表的内容,或者只是几行或几个部分。查看官方documentations了解详细信息

全局变量不是获取按下按钮的单元格索引的好方法。如果使用按钮的tag属性,则更好的方法是。使用indexPath的行(或任何模式的部分)设置按钮的标记。然后,您可以在按钮的选择器方法中获取tag

在Web服务调用完成后获取对单元格的引用,通过NSIndexPath获取indexPathForRow:inSection:的实例。

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:0];

检查细胞是否仍然可见并继续使用。

MyCustomCell *cell = (MyCustomCell *)[self.tblView cellForRowAtIndexPath:indexPath];

并在那里对那个单元格进行更改。