Ios 更改文本字段时从其他视图控制器更改变量
我试图将两个不同视图控制器中的变量值与textField的值进行更改,但我不知道如何使用委托使其工作 我的故事板: 我的代码: 主视图:Ios 更改文本字段时从其他视图控制器更改变量,ios,swift,Ios,Swift,我试图将两个不同视图控制器中的变量值与textField的值进行更改,但我不知道如何使用委托使其工作 我的故事板: 我的代码: 主视图: class GameCreatingViewController: UIViewController { var newGame = Game() override func viewDidLoad() { super.viewDidLoad() newGame = Game() n
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
}
}
tableViewController:
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的操作不会执行。使用代理通知其他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
}
我试过了(我更新了问题),但它似乎没有执行功能。必须有人来实现委托。确保您分配了一些类来实现它。例如:在cell上FORROWAT cell.delegate=self