首页 > 解决方案 > 更改 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)
        
    }

}

似乎按钮的操作执行了,但其他视图控制器的功能没有执行。

标签: iosswift

解决方案


使用委托通知另一个 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
    }


推荐阅读