Swiftで遊ぼう! - 955 - セグエが変われば戻り方も変更
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
NavigationControllerを組み込んだTableViewControllerからViewControllerに遷移(セグエ)した場合、Cancelボタンの挙動を考えないとちゃんと動かない。分かったつもりでも納得できない自分がいたんでちょっと勉強(^_^;)
チュートリアルを読み飛ばしていたら混乱した部分が出てきたんで勉強しました。右上のMealViewController上で、「Cancel」ボタンが押した場合、セグエ元が2カ所あるんで挙動を考えないといけません。
左上のMealTableViewControllerに埋め込んでいるNavigationControllerのBar Button Itemの「+」が押された時はModallyにNavigationControllerが作られてMealViewControllerを表示していることになります。
ここで考えなければならないインスタンス・プロパティが、presentingViewControllerです。
presentingViewController
ViewControllerを「Presented Modally」で遷移させると「present(_:animated:completion:) 」メソッドでViewControllerを作成することになるけど、ストーリーボードでセグエを作っているとこのメソッドは見えてきません。
presentingViewControllerプロパティはpresent(_:animated:completion:) メソッドを使って表示されるViewControllerがセットされます。もしこのメソッド以外の遷移をした場合、1つ前のViewControllerがセットされたままになります。遷移前のViewControllerが存在しなければ「nil」を持つようです。
ということは上の例で「+」を押したときに「present(_:animated:completion:) 」を使ってMealViewControllerが表示されました。実際はNavigationControllerに載っかったMealViewControllerなんで次のBool型は「true」ということになります。
let isPresentingInAddMealMode = presentingViewController is UINavigationController
そしてModallyに遷移したVIewControllerを消すメソッドはdismiss()メソッドになり次のように処理できます。
if isPresentingInAddMealMode { dismiss(animated: true, completion: nil) }
では、MealTableViewControllerのCellを選択して遷移させた場合、セグエは「Show」になるため「prepare()」メソッドは使われなかったことになります。presentingViewControllerにはMealTableViewControllerがセットされ、if節の外に外れます。
じゃあ次にセグエがShowの場合、新しいMealViewControllerが作らているけど、元に持っているNavigationControllerの上にMealViewControllerをスタックして積み上げているので、navigationControllerプロパティを持っているはずです。条件式を次のようにすればいいんでしょう。
} else if let owningNavigationController = navigationController { owningNavigationController.popViewController(animated: true) }
popViewController(animated:)
このメソッドはNavigationControllerが持っているメソッドで、一番上のスタックを消し去って再表示させます。まさに新しいスタックを作った時のキャンセルにぴったりです。
そして最後にそれ以外の条件ならエラーにします。
} else { fatalError("The MealViewController is not inside a navigation controller.") }
こう書いたけどしっくりしないな(^_^;)
Swiftで遊ぼう! - 954 - //MARK:
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
Xcodeの基本的な機能でも知らないことが多い。コーディング中にコメントを書いて整理することも勧められています。「//MARK:」を使えば、コメントをソースコードの「ファンクション・メニュー(Functions menu)」でセクションタイトルにすることができ、編集したい関数を見つけやすくなります。
この書き方ですが、「//MARK:」の後にスペースを置いて「-」中線を入れ、スペースを加えてからコメントを加えるとファンクション・メニューにセクションを分けるラインが加わります。
この内容を下記に加えました。
Swiftで遊ぼう! - 953 - もどかしい
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
コードを書いていて自分の応用力の無さを痛感します。
例えば、「segue.identifier」のように、segueのプロパティで、オプショナル型Stringのidentifierをswitch文で割り振ろうとしたとき、私はguardを使ってアンラップしようとしました。
しかし、次のようにすればすっきりですね。
switch (segue.identifier ?? "") { case "example" : .... ....
なんかもどかしいです。
Swiftで遊ぼう! - 952 - 色々と忘れます...(T_T)
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
Xcodeで操作をしていると不便に感じることが色々あるけど、大概はショートカットで解決する内容です。
実はこのショートカットもSwiftで遊ぼう! - 471 - Xcode 8 用語説明とショートカット - Swiftで遊ぼう! on Hatenaに記載していたんですが忘れてました。そこでイメージを差し替えました。
Swiftで遊ぼう! - 951 - イメージ画像を変更すると時間がかかります
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
あまりイメージを使っていないチュートリアルセクションを先に改訂しました。
Swiftで遊ぼう! - 950 - チュートリアルの改訂も面倒くさいね
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
実はiOS 10.3とSwift 3.2が公開されました!
大きな変化は無さそうですが、ファイルシステムが変更されたようですね。
これから勉強します。
アップルのチュートリアルをSwift 3に向けて改訂中
Swiftで遊ぼう! - 949 - さっさと改訂してしまおう
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
Developing iOS Apps (Swift) Work with View ControllersのページをSwift 3に対応させました!
セキュリティ面で変更がありましたね。