gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:10:50 25 4
gpt4 key购买 nike

我有一个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() within UITableViewController 时,它会起作用 - 也就是说,它将更新tableView 中的第一行:

class MyMenuTableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {

override func viewDidAppear(animated: Bool) {
updateFirstMenuRow()
}

}

请注意,正如其他 stackoverflow 问题所建议的那样,我正在尝试从主线程运行更新函数。但是,没有成功。

我已经为此苦苦挣扎了几个小时,如果有人能给我一些关于为什么我的更新功能无法正常运行的指示,我会很高兴——我猜它没有“写入权限”到 MyMenuTableViewController 中的 tableView。非常感谢!

最佳答案

这个

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

关于ios - Swift:从其他类更新 UITableView.cell.textLabel.text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28557427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com