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()
}
我认为您不需要使用通知,这要简单得多。
自从我更新到 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()
}
我认为您不需要使用通知,这要简单得多。