34511


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に入れると動きます。  
ただ、なぜそうなるのかがよくわかりません。


CC BY-SA 3.0
2017-05-07T03:43:19.370
34503
2017-05-07T08:10:49.720
2017-05-07T07:05:46.107
14210
14210
question
swift ios uinavigationcontroller
unwindしながらactionメソッドを使いたい


追記をいただいて、初めて問題の所在がわかりました。結論を先に述べますと、
**`UINabvigationBar`には、`UIButton`ではなく、`UIBarButtonItem`を配置してください。**
現状では、Unwindだけでなく、いかなるアクションメソッドもConnectできません。

[![画像の説明をここに入力](https://i.stack.imgur.com/REexA.png)](https://i.stack.imgur.com/REexA.png)

Storyboard上で、ナビゲーションバーに、`UIButton`をドラッグして配置することができます。配置するとどうなっているか、ビューの階層状態を、確認してください。

[![画像の説明をここに入力](https://i.stack.imgur.com/fQHgM.png)](https://i.stack.imgur.com/fQHgM.png)

上図のように、`UIBarButtonItem`の上に、`UIButton`が載っていることがわかります。この状態で、右クリック（Controlキー＋クリック）してドラッグで、Connectすると、`UIButton`からでなく、その下の`UIBarButtonItem`がConnect元となります。現状でも、Document
Outlineから操作すれば、`UIButton`から引っ張ることができますが、むだに`UIButton`と`UIBarButtonItem`の二段重ねになっていることを考えると、そもそも`UIButton`を使わないという選択が合理的だと思います。  
（`UINavigationBar`にボタン以外の、たとえば`UISearchBar`などの`UIControl`サブクラスを配置したい要請があることを、考慮して、`UIBarButtonItem`以外も配置できることになっているのでしょう。）


CC BY-SA 3.0
2017-05-07T08:10:49.720
34511
2017-05-07T08:10:49.720
18540
34503
answer