Xcode 8.3.3 Swift 3 - 变量不在文件之间更新

Xcode 8.3.3 Swift 3 - Variable not updating between files

自从我更新到 8.3.3 后,我遇到了 xcode 的问题。我通常使用 MCV(模型 - 视图 - 控制器)方法,现在,我的变量不会在它们之间更新。

情况:我有一个模型(存储所有主要变量和计算函数);一个TableView Controller(控制Tableview)和TableViewCell(设置Outlet和actions)

目标: 在单元格中按下按钮时,它应该在 TableView 中添加一行。

问题:为什么 table 视图没有获取 Model() 变量的新值。

为了更好地理解,这里是正在发生的事情的时间表:

运行 > 运行 TableViewController 中的 viewDidLoad > 更新 Model() 中的变量测试 > 调用 cellForRowAt 并打印 ["1"] > 显示 tableView 1 行 >按下按钮 > 打印 ["1"] > 添加 ["2"] 到 Model() > 打印 ["1","2"] > post 通知 > viewDidLoad 获取通知并打印 "reloading table" >调用 cellForRowAt 并打印 ["1"] > tableView 保留 1 行。

这是我的代码示例之一:

我有我的 Model.Swift:

class Model {
    var test : [String] = []
}

我的 TableViewController:

class BudgetTableViewController: UITableViewController {

let model = Model()

override func viewDidLoad() {
    super.viewDidLoad()
    model.test.append("1") 
    center.addObserver(forName: NSNotification.Name(rawValue: "reloadTableVIew"), object: appDelegate, queue: queue) {[unowned self] (_) in
            print("reloading table")
            self.tableView.reloadData()
    }
}

为了简化.. 在部分中,我一直返回“1”,对于行,我在 Model() 中计算变量测试。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    print(model.test) // **ALWAYS PRINT ["1"]**
    let cell = tableView.dequeueReusableCell(withIdentifier: "buttonCell", for: indexPath) as! TableViewCell
    return Cell
}

还有我的 TableViewCell:

class TableViewCell: UITableViewCell{
  let model = BudgetModel()
  let notification = Notification(name: Notification.Name(rawValue: "reloadTableVIew"), object: appDelegate)

  @IBAction func okButton(_ sender: UIButton) {
    print(model.test)
    model.test.append("2")
    print(model.test)
    NotificationCenter.default.post(notification)
  }
}

我希望它足够清楚。 关键是,如果我按下按钮 5 次,它会将字符串添加到数组中 5 次(在打印中确认)但是当调用 cellForRowAt 时,它将始终打印 ["1"]。

感谢您的帮助

两个模型变量不同类。您的 viewController 中有 var 模型,您的单元格中有 var 模型。改变一个不会影响另一个。你最好为你的单元格实现一个委托,其中 viewController 是委托,单元格在按下时调用它 -

protocol MyCellDelegate: class {
    func cellWasPressed()
}

单元格中 -

weak var delegate: MyCellDelegate?

创建单元格时将此设置为 viewController。

然后在按下按钮的方法中,添加-

self.delegate?.cellWasPressed()

在viewController中,实现这个-

func cellWasPressed() {
    self.model.test.append("2")
    self.tableView.reloadData()
}

我认为您不需要使用通知,这要简单得多。