Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 更改文本字段时从其他视图控制器更改变量_Ios_Swift - Fatal编程技术网

Ios 更改文本字段时从其他视图控制器更改变量

Ios 更改文本字段时从其他视图控制器更改变量,ios,swift,Ios,Swift,我试图将两个不同视图控制器中的变量值与textField的值进行更改,但我不知道如何使用委托使其工作 我的故事板: 我的代码: 主视图: class GameCreatingViewController: UIViewController { var newGame = Game() override func viewDidLoad() { super.viewDidLoad() newGame = Game() n

我试图将两个不同视图控制器中的变量值与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
    }
}
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