[英]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.