reloadRowsAtIndexPaths不会更新我的单元格数据

时间:2015-09-08 20:32:59

标签: ios swift uitableview

我的ViewController中有一个UITableView。 其中一个单元格可以插入另一个TableViewController以允许选择一个值。

我想从被调用者ViewController返回后更新我的单元格。

现在,我可以通过委托传回选定的值。

然而,我尝试了以下方式,它们都没有效果。

  1. self.mainTable.reloadData()

  2.     dispatch_async(dispatch_get_main_queue()) {
        self.mainTable.reloadData()
    }
    
  3.     self.mainTable.beginUpdates()
    self.mainTable.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
    self.mainTable.endUpdates()
    

    func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath) - > UITableViewCell { 被调用并且没有错误地执行。

  4. 但是UI并没有改变

    这是我更新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中的先前值。

    我将属性更改为静态属性,然后解决问题。 我不确定实例属性有什么问题,以及它为什么会反转。

    static var _address:String =""

2 个答案:

答案 0 :(得分:1)

您似乎正试图从UITableView抓取一个单元格,然后以这种方式更新textLabel值。但是,UITableViewUITableViewCell并不意味着以这种方式更新。相反,将address的值存储在您的类中,并在委托调用您的类时更新此值。如果cellForRowAtIndexPath使用UITableViewCell的值构建self.address,则在调用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
}

答案 1 :(得分:0)

您的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;
}