Swift: UITableView 未使用 reload() 正确更新数据

Swift: UITableView does not update data properly using reload()

我有一个 30 多岁的语言 table 分为 4 个部分..

我的问题是,当我想更改其中一个单元格中的值时,该值不会 update/change 直到我将该单元格滚动出视图并返回...

我使用 UIAlert 来输入新值,然后将其保存到数据库中。然后值就保存好了,我又从数据库中取回了正确的值。

但是当我重新加载 tableView 它没有显示新值..

奖金: 我有两个 table视图,一个名为:templateTableView,另一个名为:fieldTableViewfieldTableView 是我要更改的值。将 tableView.reload() 更改为 self!.fieldTableView.reload() 也不起作用。

来自 didSelectRowAtIndexPath:

}else if currTemplate!.hasPassFail{
            var alertController:UIAlertController?
            alertController = UIAlertController(title: "Enter new value",
                message: "Enter new value",
                preferredStyle: .Alert)

            alertController!.addTextFieldWithConfigurationHandler(
                {(textField: UITextField!) in
                    textField.placeholder = ""
                    textField.keyboardType = UIKeyboardType.NumbersAndPunctuation
            })

            let action = UIAlertAction(title: "Submit",
                style: UIAlertActionStyle.Default,
                handler: {[weak self]
                    (paramAction:UIAlertAction!) in
                    if let textFields = alertController?.textFields{
                        let theTextFields = textFields as! [UITextField]
                        let enteredText = theTextFields[0].text
                        //what to do after edit, here:
                        switch indexPath.section{
                        case 1:
                            if let value = enteredText.toInt(){
                                self!.currTemplate!.backgroundMin[indexPath.row] = value
                            }else{
                                self!.presentViewController(self!.wrongNumberAlert, animated: true, completion: nil)
                                return
                            }
                        case 2:
                            if let value = enteredText.toInt(){
                                self!.currTemplate!.legendMin[indexPath.row] = value
                            }else{
                                self!.presentViewController(self!.wrongNumberAlert, animated: true, completion: nil)
                                return
                            }
                        case 3:
                            if let value = enteredText.toDouble(){
                                self!.currTemplate!.ratioMin[indexPath.row] = value
                            }else{
                                self!.presentViewController(self!.wrongNumberAlert, animated: true, completion: nil)
                                return
                            }
                        default:
                            0-0
                        }
                        var date = NSDate()
                        self!.currTemplate!.timestamp = date.makeTimestampString()
                        self!.appDelegate.dbInterface.updateTemplate(self!.currTemplate!)
                        //self!.templateArr = self!.appDelegate.dbInterface.findTemplates()
                        self!.findAllNotDeleteOnSync()
                        println("Data was added to DB: \(self!.currTemplate!.ratioMin[indexPath.row])")
                        self!.templateTableView.reloadData()
                        self!.templateTableView.selectRowAtIndexPath(self!.currentTemplateIndex, animated: false, scrollPosition: .None)
                        dispatch_async(dispatch_get_main_queue(),{
                            tableView.reloadData()
                        })
                    }
                })
            let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: nil)
            alertController?.addAction(cancel)
            alertController?.addAction(action)
            self.presentViewController(alertController!, animated: true, completion: nil)
        }

编辑 应该工作的代码部分是这样的:

dispatch_async(dispatch_get_main_queue(),{
   tableView.reloadData()
})

改用这个:

tableView.reloadData()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    // do DB stuff in background thread
    // ...

    dispatch_async(dispatch_get_main_queue(), {
        // Update UI in main thread when done
        // ...
    })
})

这条线导致故障

if indexPath.row == 0 && indexPath.section == 1

仔细看看你在这种情况下写的东西 您仅在满足条件的情况下附加数据 但是在这种情况下,您的 didselectrowatindexpath

case 3: 
if let value = enteredText.toDouble(){ 
self!.currTemplate!.ratioMin[indexPath.row] = value 
}else{ 
self!.presentViewController(self!.wrongNumberAlert, animated: true, completion: nil) 
return 
}

获取失败 这就是为什么当您在第 2 部分和第 3 部分编辑行时没有数据被附加 将附加代码移到其他地方 或者使用 if indexPath.row == 0 && indexPath.section == 1 这个条件 sectionwise

为我工作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    dispatch_async(dispatch_get_main_queue(), {
        // Update UI in main thread when done
        tableView.reloadData()
    })
})