Swift:从其他类更新UITableView.cell.textLabel.text

时间:2015-02-17 08:15:22

标签: ios uitableview swift

我有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。非常感谢提前!

2 个答案:

答案 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的实例。