繁体   English   中英

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

[英]Xcode 8.3.3 Swift 3 - Variable not updating between files

自从我更新到8.3.3以来,xcode出现了问题。 我通常使用MCV(模型-视图-控制器)方法,现在,变量之间没有更新。

情况 :我有一个模型(存储所有主要变量和计算函数); TableView控制器(控制Tableview)和TableViewCell(设置出口和操作)

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

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

为了更好地理解,这是发生了什么的时间表:

运行>在TableViewController中运行viewDidLoad>在Model()中更新变量测试>调用cellForRowAt并打印[“ 1”]>显示具有1行的tableView>按下按钮>打印[“ 1”]>向模型添加[“ 2”] ()>打印[“ 1”,“ 2”]>发布通知> viewDidLoad获取通知并打印“重新加载表”> 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()中计算变量test。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM