reloadRowsAtIndexPaths 不会更新我的单元格数据
Posted
技术标签:
【中文标题】reloadRowsAtIndexPaths 不会更新我的单元格数据【英文标题】:reloadRowsAtIndexPaths doesn't update my cell data 【发布时间】:2015-09-08 20:32:58 【问题描述】:我的 ViewController 中有一个 UITableView。 可以将其中一个单元格接入另一个 TableViewController 以允许选择一个值。
我想在从被调用者 ViewController 回来后更新我的单元格。
现在,我可以通过委托传回选定的值。
但是,我尝试了以下方法,它们都不起作用。
self.mainTable.reloadData()
dispatch_async(dispatch_get_main_queue())
self.mainTable.reloadData()
self.mainTable.beginUpdates()
self.mainTable.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
self.mainTable.endUpdates()
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 被调用并没有错误地执行。
但用户界面并没有改变
这是我在 cellForRowAtIndexPath 中更新值的方式
if let currentCell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!
currentCell.textLabel?.text = address
return currentCell
这是我的cellForRowAtIndexPath
-
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let id = "Cell"
println(indexPath)
if indexPath.row == 1
var cell = tableView.dequeueReusableCellWithIdentifier(id) as? UITableViewCell
if cell == nil
cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: id)
cell?.contentMode = UIViewContentMode.Center
cell?.selectionStyle = UITableViewCellSelectionStyle.None
cell?.contentView.addSubview(mapView!)
return cell!
else
let cell = UITableViewCell()
cell.textLabel?.text = self.address
return cell
这是委托方法-
func passBackSelectedAddress(address: String)
self.address = address
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.mainTable.beginUpdates()
self.mainTable.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
self.mainTable.endUpdates()
我的修复: 经过更多调试,我找到了原因, self.address 值在委托中更新,但它回滚到 cellForRowAtIndexPath 中的先前值。
我将属性更改为静态属性,然后解决问题。 我不确定实例属性有什么问题,以及为什么它会反转。
静态变量 _address:String = ""
【问题讨论】:
不要在cellForRowAtIndexPath
中调用cellForRowAtIndexPath
。您需要更新您的数据模型,然后让cellForRowAtIndexPath
中的普通代码完成它的工作。
我的模型只是一个简单的字符串变量,我没有自己调用它。我在我的代表处调用它 // MARK: delegate func passBackSelectedAddress(address: String) self.address = address var indexPath = NSIndexPath(forRow: 0, inSection: 0) self.mainTable.beginUpdates() self.mainTable.reloadRowsAtIndexPaths( [indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) self.mainTable.endUpdates()
您确定您的代表正在被呼叫吗?你能展示你完整的cellForRowAtIndexPath
方法吗?
我确定它被调用了,我设置了断点,然后它就停止了。这是代码pastie.org/10406140
请编辑您的问题以包含代码
【参考方案1】:
您似乎正试图从UITableView
中获取一个单元格,然后以这种方式更新textLabel
值。但是,UITableView
和 UITableViewCell
并不意味着以这种方式更新。相反,将address
的值存储在您的类中,并在委托回调到您的类时更新此值。如果cellForRowAtIndexPath
使用self.address
的值构造UITableViewCell
,则在调用mainTable.reloadData()
之后应该将单元格更新为新值。
例如:
var address: String
func delegateCompleted(address: String)
self.address = address
self.mainTable.reloadData()
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier(<your identifier>)
if (indexPath == <your address cell indexPath>)
let textLabel = <get your textLabel from the cell>
textLabel?.text = self.address
return cell
【讨论】:
而不是从当前单元格获取,我也在下面尝试过,没有任何改变。单元格值仍然相同 let cell = UITableViewCell() cell.textLabel?.text = self.address 我建议您阅读与UITableView
和 UITableViewCell
相关的教程和文档以及它们如何协同工作。您可以在cellForRowAtIndexPath
中构造UITableViewCell
并手动将UILabel
添加为子视图,或者使用 .xibs/Interface Builder 设计单元并指定单元重用标识符,然后在代码中引用它以实例化单元并找到UILabel
。 Here is the documentation for UITableView.
根据苹果的文档,“但是,如果通知用户并不重要——也就是说,你只想更改单元格显示的值——你可以获取特定行的单元格并设置它的新值。”如果我理解正确,我可以获取单元格并更新值。
您必须使用 Apple 的内置默认样式之一 UITableViewCell
s 才能使用内置的 textLabel 属性。尝试使用initWithStyle:reuseIdentifier:
构造函数。
感谢 abouzek 的帮助。【参考方案2】:
您的cellForRowAtIndexPath
有一些问题 -
如果您使用的是故事板,那么您应该创建适当的原型单元和子类并分配相关的单元重用 ID。如果您不是,那么我建议您创建一个单元子类并针对重用标识符注册这些类。你的cellForRowAtIndexPath
看起来像 -
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
var returnCell:UITableViewCell
if indexPath.row == 1
var myMapCell = tableView.dequeueReusableCellWithIdentifier("mapCell", forIndexPath:indexPath) as MYMapCell
myMapCell.contentMode = UIViewContentMode.Center
myMapCell.selectionStyle = UITableViewCellSelectionStyle.None
// Set the properties for a map view in the cell rather than assigning adding an existing map view
returnCell=myMapCell
else
returnCell = tableView.dequeueReusableCellWithIdentifier("addressCell", forIndexPath:indexPath)
returnCell.textLabel?.text = self.address
return returnCell;
【讨论】:
感谢 Paulw 的帮助以上是关于reloadRowsAtIndexPaths 不会更新我的单元格数据的主要内容,如果未能解决你的问题,请参考以下文章
reloadRowsAtIndexPaths:withRowAnimation: 使我的应用程序崩溃
iOS Swift 和 reloadRowsAtIndexPaths 编译错误