我有UITableViewController
:
class MyMenuTableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
func updateFirstMenuRow() {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
println("tableview is \(self.tableView)")
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
var cell = self.tableView.cellForRowAtIndexPath(indexPath)
var rand = arc4random()
cell!.textLabel!.text = "\(rand)"
cell!.setNeedsLayout()
cell!.setNeedsDisplay()
println("cell is \(cell)")
println("rand is \(rand)")
println("textLabel.text is \(cell!.textLabel!.text!)")
})
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// Return the number of sections.
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// Return the number of rows in the section.
return 3
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("CELL") as? UITableViewCell
if (cell == nil) {
cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CELL")
}
switch indexPath.row {
case 0:
cell!.textLabel?.text = "This is the old text"
case 1:
cell!.textLabel?.text = "Foo"
case 2:
cell!.textLabel?.text = "Bar"
default:
cell!.textLabel?.text = "UNDEFINED"
}
return cell!
}
}
请注意,我有一个函数updateFirstMenuRow()
,我将使用不同的值更新第一个tableView行的textLabel.text(在我的文本情况下,使用不同的数字)。
我需要从另一个类运行updateFirstMenuRow()
,如下所示:
class MyOtherClass:UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
MyMenuTableViewController().updateFirstMenuRow()
}
//.....
}
它将在控制台中显示所有println
,但它不会使用随机数更新cell.textLabel.text。
在控制台中,我可以看到:
tableView不是nil
单元格不是nil
rand始终是一个不同的随机数
textLabel.text返回(奇怪的是)总是更新的随机数(rand)
但是,MyMenuTableViewController
中的实际textLabel.text永远不会更新,并保持其初始值"This is the old text"
。
当我尝试在 updateFirstMenuRow()
中运行UITableViewController
时,它会起作用 - 这意味着它会更新tableView中第一行的textLabel.text:
class MyMenuTableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
override func viewDidAppear(animated: Bool) {
updateFirstMenuRow()
}
}
请注意,我正在尝试从主线程运行更新函数,如其他stackoverflow问题所示。但是,没有成功。
我现在已经在这几个小时里苦苦挣扎了,如果有人能给我一些指示,为什么我的更新功能无法正常运行,我会很高兴 - 我的猜测是它没有“写访问权限”到tableView
中的MyMenuTableViewController
。非常感谢提前!
答案 0 :(得分:1)
这个
<强> MyMenuTableViewController()强> .updateFirstMenuRow()
创建MyMenuTableViewController
的新实例 - 因此该方法在屏幕上没有的实例上执行。这就是为什么你看到println
的输出,但在tableview中没有变化。
您需要将对MyMenuTableViewController
实例的引用传递给MyOtherClass
实例。您需要向MyOtherClass
添加一个属性才能保存引用 -
menuTableViewController:MyMenuTableViewController?
你没有表明你是如何从一个到另一个的,但是,例如,如果它是通过segue你将使用以下 -
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "someIdentifier") {
let destinationVC = segue.destinationViewController as MyOtherClass
destinationVC.menuTableViewController = self
}
}
然后在MyOtherClass
中你可以说 -
if (self.menuTableViewController != nil) {
self.menuTableViewController!.updateFirstMenuRow()
}
答案 1 :(得分:0)
感谢Paul的回答,我设法解决了我的问题。
我实际上正在使用一个委托,该委托在MyOtherClass
中被触发,并且#34;转发&#34;更新textLabel.text的命令 - 但是,我设法得到了正确的引用。
之前,我曾两次使用MyMenuTableViewController()
现在我正在使用var menuTableViewController:MyMenuTableViewController?
,然后我使用self.menuTableViewController = MyMenuTableViewController()
设置一次值,然后我使用menuTableViewController!
或menuTableViewController!.updateFirstMenuRow()
,所以我总是更新tableView &#34;相同的&#34; MyMenuTableViewController
的实例。