私は、welcomeVCが人の名前で挨拶メッセージを表示する簡単なアプリを持っています。別のVC nameVCでは、ユーザーは呼び出す名前を変更することができ、クリックしたときにwelcomeVCの名前を更新すると仮定します。メインビューコントローラーに設定されていても、nilエラーを委任しました
はバックwelcomeVCにnameVCから名前を渡すために、私はnameVCのプロトコルChangeNameDelegateを設定し、私のクラスで変数を作成しました:私のwelcomeVCで
protocol ChangeNameDelegate {
func updateName(name: String)
}
class nameViewController: UIViewController {
@IBOutlet weak var nameTextField: UITextField!
var changeNameDelegate: ChangeNameDelegate!
override func viewDidLoad() {
}
@IBAction func closeNameVC(_ sender: UIButton) {
if let newName = nameTextField.text {
changeNameDelegate.updateName(name: newName)
}
dismiss(animated: true, completion: nil)
}
}
、私は確かにそれと判断していますデリゲートを登録し、以下のように設定することで、プロトコルに準拠しています。私は私のアプリを実行したときchangeNameDelegateがnilであるように思われたので
class welcomeViewController: UIViewController, UIViewControllerTransitioningDelegate {
let nameVC = nameViewController()
override func viewDidLoad() {
nameVC.changeNameDelegate = self
}
}
extension welcomeViewController: ChangeNameDelegate {
func updateName(name: String) {
print("The name has been updated!")
nameLabel.text = name
}
}
はしかし、それがクラッシュしました。誰もがそこに見逃されるかもしれないことを知っていますか?前もって感謝します!
ありがとうございました。私はコードを更新しました: public override func prepare(segue:UIStoryboardSegue、送信者:Any?){ let nameVC = segue.destination as? nameViewController nameVC?.changeNameDelegate = self } ただし、問題はまだ存在します。何が間違っているのか分からない。 – Gezimao
ストーリーボードで、あなたのNameViewControllerクラスをIDインスペクタでカスタムクラスとして設定しましたか? – CodeCrackPot
はい。これはカスタムクラスに設定されています。私は実際にwelcomeVCからnameVCへのセグを持っていないことに気付きました。だから '' 'letVC:nameViewController = UIStoryboard(name:" Main "、bundle:nil)を使ってnameVCをstroyboardから参照するように変更しました。 instantiateViewController(withIdentifier: "NameVC")として! nameViewController nameVC.changeNameDelegate =自己 '' が、それはデリゲートがまだゼロである、あまり助けにはならなかった。( – Gezimao