Swift: UITableView 未使用 reload() 正确更新数据
Swift: UITableView does not update data properly using reload()
我有一个 30 多岁的语言 table 分为 4 个部分..
我的问题是,当我想更改其中一个单元格中的值时,该值不会 update/change 直到我将该单元格滚动出视图并返回...
我使用 UIAlert 来输入新值,然后将其保存到数据库中。然后值就保存好了,我又从数据库中取回了正确的值。
但是当我重新加载 tableView
它没有显示新值..
奖金: 我有两个 table视图,一个名为:templateTableView
,另一个名为: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()
})
改用这个:
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()
})
})
我有一个 30 多岁的语言 table 分为 4 个部分..
我的问题是,当我想更改其中一个单元格中的值时,该值不会 update/change 直到我将该单元格滚动出视图并返回...
我使用 UIAlert 来输入新值,然后将其保存到数据库中。然后值就保存好了,我又从数据库中取回了正确的值。
但是当我重新加载 tableView
它没有显示新值..
奖金: 我有两个 table视图,一个名为:templateTableView
,另一个名为: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()
})
改用这个:
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()
})
})