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 值。但是,UITableViewUITableViewCell 并不意味着以这种方式更新。相反,将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 我建议您阅读与 UITableViewUITableViewCell 相关的教程和文档以及它们如何协同工作。您可以在cellForRowAtIndexPath 中构造UITableViewCell 并手动将UILabel 添加为子视图,或者使用 .xibs/Interface Builder 设计单元并指定单元重用标识符,然后在代码中引用它以实例化单元并找到UILabel。 Here is the documentation for UITableView. 根据苹果的文档,“但是,如果通知用户并不重要——也就是说,你只想更改单元格显示的值——你可以获取特定行的单元格并设置它的新值。”如果我理解正确,我可以获取单元格并更新值。 您必须使用 Apple 的内置默认样式之一 UITableViewCells 才能使用内置的 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 编译错误

如何覆盖 reloadRowsAtIndexPath?

reloadRowsAtIndexPaths 崩溃;重新加载数据工作

reloadRowsAtIndexPaths 时保持偏移

UITableView reloadRowsAtIndexPaths 图形故障