我的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 { 被调用并且没有错误地执行。
但是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 =""
答案 0 :(得分:1)
您似乎正试图从UITableView
抓取一个单元格,然后以这种方式更新textLabel
值。但是,UITableView
和UITableViewCell
并不意味着以这种方式更新。相反,将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;
}