ios - 更改 textField 时从其他视图控制器更改变量
问题描述
我正在尝试从 textField 的值更改两个不同视图控制器中变量的值,但我不明白如何使用委托以使其工作。
我的故事板:
我的代码:
主视图:
class GameCreatingViewController: UIViewController {
var newGame = Game()
override func viewDidLoad() {
super.viewDidLoad()
newGame = Game()
newGame.playerBook.NumberOfPlayers = 2
if let vc = self.children.first(where: { $0 is PlayersTableViewController }) as? PlayersTableViewController {
vc.currentGame = self.newGame
vc.tableView.reloadData()
}
if let vc = self.children.first(where: { $0 is GameViewController }) as? GameViewController {
vc.currentGame = self.newGame
}
}
func changeName(name: String, number: Int) {
self.newGame.playerBook.players[number].name = name
}
}
表视图控制器:
class PlayersTableViewController: UITableViewController, UITextFieldDelegate {
var currentGame = Game()
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "playerCell", for: indexPath) as? PlayerNameTableViewCell else {fatalError("Wrong type of cell")}
// Configure the cell...
cell.playerName.delegate = self
let row = indexPath[1]+1
cell.numberOfPlayer = row
return cell
}
func changeName(name: String, number: Int) {
self.currentGame.playerBook.players[number].name = name
}
}
细胞:
protocol changeNameDelegate: class {
func changeName(name: String, number: Int)
}
class PlayerNameTableViewCell: UITableViewCell, UITextFieldDelegate {
weak var delegate: changeNameDelegate? = nil
@IBOutlet weak var playerName: UITextField!
var numberOfPlayer: Int = Int()
@IBAction func changeName(_ sender: UITextField) {
delegate?.changeName(name: sender.text!, number: numberOfPlayer)
}
}
似乎按钮的操作执行了,但其他视图控制器的功能没有执行。
解决方案
使用委托通知另一个 viewController。
确保不是零。
通常协议名称的第一个字母大写。一个好的做法是在扩展中实现协议。
实施changeNameDelegate
协议。
class PlayersTableViewController: UITableViewController, UITextFieldDelegate, changeNameDelegate {
并在单元格配置中设置委托。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "playerCell", for: indexPath) as? PlayerNameTableViewCell else {fatalError("Wrong type of cell")}
// Configure the cell...
cell.playerName.delegate = self
cell.delegate = self // This line is missing.
let row = indexPath[1]+1
cell.numberOfPlayer = row
return cell
}
推荐阅读
- postgresql - 我正在尝试检查我的文本类型的 record_array 的第一个数字,在 postgres 中以 4 到 9 开头
- python - python中数组内多个对象元素的总和和平均值
- android - 在我的部分代码中哪些对象是非空类型?我有 kotlin.TypeCastException: null cannot be cast to non-null type kotlin.String 异常
- oracle - 在oracle中替换字符串
- jquery - 如何使用 CSS 类索引简化更改功能
- teradata - 在 Teradata 的 RANDOM 函数中使用列作为下限和上限
- java - 如何制作chipView ractangle
- node.js - Heroku 应用程序不打印我发送给它的响应,它只打印控制台日志
- php - 代理 API(单个自定义 php)不适用于 Mozilla firefox 浏览器和使用 chrome 和 postman
- html - 如何使用 Bootstrap 4 (flex) 正确地做奇怪的嵌套列?