【问题标题】:Xcode 8.3.3 Swift 3 - Variable not updating between filesXcode 8.3.3 Swift 3 - 变量不在文件之间更新
【发布时间】:2017-06-16 14:54:13
【问题描述】:

我在使用 xcode 时遇到问题,因为我更新到 8.3.3。我通常使用 MCV(模型 - 视图 - 控制器)方法,现在,我的变量没有在它们之间更新。

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

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

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

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

运行 > 在 TableViewController 中运行 viewDidLoad > 在 Model() 中更新变量测试 > 调用 cellForRowAt 并打印 ["1"] > 显示带有 1 行的 tableView > 按下按钮 > 打印 ["1"] > 添加 ["2" ] 到 Model() > 打印 ["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() 中的变量测试。

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"]。

感谢您的帮助

【问题讨论】:

    标签: swift model-view-controller tableview tableviewcell


    【解决方案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()
    }
    

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

    【讨论】:

    • 谢谢!效果很好!我正在寻找一种避免使用通知的方法!这很合适!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多