Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 955 - セグエが変われば戻り方も変更

NavigationControllerを組み込んだTableViewControllerからViewControllerに遷移(セグエ)した場合、Cancelボタンの挙動を考えないとちゃんと動かない。分かったつもりでも納得できない自分がいたんでちょっと勉強(^_^;)

f:id:yataiblue:20170406112845j:plain

チュートリアルを読み飛ばしていたら混乱した部分が出てきたんで勉強しました。右上の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:

Xcodeの基本的な機能でも知らないことが多い。コーディング中にコメントを書いて整理することも勧められています。「//MARK:」を使えば、コメントをソースコードの「ファンクション・メニュー(Functions menu)」でセクションタイトルにすることができ、編集したい関数を見つけやすくなります。

この書き方ですが、「//MARK:」の後にスペースを置いて「-」中線を入れ、スペースを加えてからコメントを加えるとファンクション・メニューにセクションを分けるラインが加わります。

f:id:yataiblue:20170401125119j:plain

この内容を下記に加えました。

yataiblue.hatenablog.com

Swiftで遊ぼう! - 953 - もどかしい

コードを書いていて自分の応用力の無さを痛感します。

例えば、「segue.identifier」のように、segueのプロパティで、オプショナル型Stringのidentifierをswitch文で割り振ろうとしたとき、私はguardを使ってアンラップしようとしました。

しかし、次のようにすればすっきりですね。

switch (segue.identifier ?? "") {
         
        case "example" : ....
        ....

なんかもどかしいです。

Swiftで遊ぼう! - 952 - 色々と忘れます...(T_T)

Xcodeで操作をしていると不便に感じることが色々あるけど、大概はショートカットで解決する内容です。

実はこのショートカットもSwiftで遊ぼう! - 471 - Xcode 8 用語説明とショートカット - Swiftで遊ぼう! on Hatenaに記載していたんですが忘れてました。そこでイメージを差し替えました。

「Ctrl + shift + クリック」

トーリーボード上に設置しているUIオブジェクトが重なりあっているとストーリーボード上で選択するのが難しくなります。例えばカスタムUITableViewCellに独自にUIViewオブジェクトを加えていった場合です。このショートカットを使うとメニューでオブジェクトがリスト表示されるため選択が容易です。表示の順番は階層順なので階層上位が一番上に表示されています。

f:id:yataiblue:20170331145536j:plain

Swiftで遊ぼう! - 951 - イメージ画像を変更すると時間がかかります

あまりイメージを使っていないチュートリアルセクションを先に改訂しました。

yataiblue.hatenablog.com

Swiftで遊ぼう! - 950 - チュートリアルの改訂も面倒くさいね

実はiOS 10.3とSwift 3.2が公開されました!

大きな変化は無さそうですが、ファイルシステムが変更されたようですね。

これから勉強します。

アップルのチュートリアルをSwift 3に向けて改訂中

yataiblue.hatenablog.com

Swiftで遊ぼう! - 949 - さっさと改訂してしまおう

Developing iOS Apps (Swift) Work with View ControllersのページをSwift 3に対応させました!

セキュリティ面で変更がありましたね。

yataiblue.hatenablog.com