質問: Xcode8.3.1 iOS 10.3 Swift3 NavigationControllerでpush segueを使って画面遷移をしています。 遷移先のbuttonを押すとunwindして親画面に戻るようにしたのですが、その際buttonに紐づけたactionメソッドが実行されなくて困っています。 viewWillDisappearを使って見たのですが、親のViewのViewWillAppearより後に呼ばれてしまうため、他の方法を探しています。 遷移先のbuttonが押された際にunwindしながら、遷移先で処理を実行するか、値を親のViewに渡すかしたいのですがどのような方法があるでしょうか。 **追記** コメントを見て色々試して見た結果、遷移先のNavigationBarに直接buttonを配置して、Action及びunwindを設定するとダメでした。 一度NavigationBar以外のところに設置してからActionとunwindを紐づけて、その後NavigationBarに入れると動きます。 ただ、なぜそうなるのかがよくわかりません。
回答: 追記をいただいて、初めて問題の所在がわかりました。結論を先に述べますと、 **`UINabvigationBar`には、`UIButton`ではなく、`UIBarButtonItem`を配置してください。** 現状では、Unwindだけでなく、いかなるアクションメソッドもConnectできません。 !画像の説明をここに入力 Storyboard上で、ナビゲーションバーに、`UIButton`をドラッグして配置することができます。配置するとどうなっているか、ビューの階層状態を、確認してください。 !画像の説明をここに入力 上図のように、`UIBarButtonItem`の上に、`UIButton`が載っていることがわかります。この状態で、右クリック(Controlキー+クリック)してドラッグで、Connectすると、`UIButton`からでなく、その下の`UIBarButtonItem`がConnect元となります。現状でも、Document Outlineから操作すれば、`UIButton`から引っ張ることができますが、むだに`UIButton`と`UIBarButtonItem`の二段重ねになっていることを考えると、そもそも`UIButton`を使わないという選択が合理的だと思います。 (`UINavigationBar`にボタン以外の、たとえば`UISearchBar`などの`UIControl`サブクラスを配置したい要請があることを、考慮して、`UIBarButtonItem`以外も配置できることになっているのでしょう。)