更改textField时,从其他视图控制器更改变量

时间:2019-07-02 12:29:09

标签: ios swift

我试图从textField的值更改两个不同视图控制器中变量的值,但我不知道如何使用委托使其起作用。

我的故事板:

我的代码:

MainView:

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)

    }

}

该按钮上的操作似乎已执行,但其他视图控制器的功能却未执行。

1 个答案:

答案 0 :(得分:2)

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