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

时间:2015-08-24 11:37:20

标签: ios swift uitableview reload uialertaction

我有一张30英寸的桌子,分为4个部分..

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

我使用UIAlert,输入新值,将其保存到数据库..并且保存的值正常,我从数据库中再次获得正确的值..

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

Bouns:我有两个名为templateTableView的tableView,另一个名为fieldTableView。我正在尝试更改值fieldTableView。而将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()
})

4 个答案:

答案 0 :(得分:1)

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
        // ...
    })
})

答案 1 :(得分:1)

此行导致故障

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

仔细看看你在这种情况下写的是什么 你附加的数据只有ablove条件满足 但在这种情况下,在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部分和第2部分中编辑行时没有附加数据的原因。 3 在其他地方移动附加代码 或逐段使用if indexPath.row == 0 && indexPath.section == 1这个条件

答案 2 :(得分:0)

请改用:

tableView.reloadData()

答案 3 :(得分:0)

为我工作:

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()
    })
})