2017-09-10 11 views
0

私は、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 
    } 

} 

はしかし、それがクラッシュしました。誰もがそこに見逃されるかもしれないことを知っていますか?前もって感謝します!

答えて

0

WelcomeViewControllerからのルーティング時に、newインスタンスのNameViewControllerがインスタンス化されているようです。前にインスタンス化されたnameVCに移動する必要があります。

+0

ありがとうございました。私はコードを更新しました: public override func prepare(segue:UIStoryboardSegue、送信者:Any?){ let nameVC = segue.destination as? nameViewController nameVC?.changeNameDelegate = self } ただし、問題はまだ存在します。何が間違っているのか分からない。 – Gezimao

+0

ストーリーボードで、あなたのNameViewControllerクラスをIDインスペクタでカスタムクラスとして設定しましたか? – CodeCrackPot

+0

はい。これはカスタムクラスに設定されています。私は実際にwelcomeVCからnameVCへのセグを持っていないことに気付きました。だから '' 'letVC:nameViewController = UIStoryboard(name:" Main "、bundle:nil)を使ってnameVCをstroyboardから参照するように変更しました。 instantiateViewController(withIdentifier: "NameVC")として! nameViewController nameVC.changeNameDelegate =自己 '' が、それはデリゲートがまだゼロである、あまり助けにはならなかった。( – Gezimao

-1

私は後でnotification/observerを使用して問題を解決しました。子ビューで

let userUpdateNotification = Notification.Name(rawValue: "nameNotificationKey") 
NotificationCenter.default.addObserver(self, selector: #selector(updateUser), name: userUpdateNotification, object: nil) 
    } 

func updateUser(not: NSNotification) { 
    if let userInfo = not.userInfo { 
     if let userName = userInfo["name"] as? String { 
      nameLabel.text = userName 
     } 
    } 
} 

:親ビューで

let name = Notification.Name(rawValue: "nameNotificationKey") 
      NotificationCenter.default.post(name: name , object: self, userInfo: ["name": nameTextField.text!]) 
     } 

デリゲート/プロトコルが接続されていないビューコントローラ間で動作しない場合、私は知りません。これについて知っている人は誰でもコメントを歓迎します!

+0

これは怠け者です。彼らは「未接続」ではありません。これらの2つのView Controllerの間には関係がある、お互いに話す方法があります。その関係が何であるかを明確にする必要があります。ユーザのデフォルトや他の一般的に利用可能なDropboxに名前を保存するほうが良いでしょう。 – matt

関連する問題