Master Detail テンプレートの調整

Auto Layout の調整もひと段落して、さて、動作検証でもしましょうかと iPad の simlator を立ち上げたら、iPad では勝手に splitView で表示されるのですね。そういえば、Main.storyboard でも、一番はじめのが UISplitViewController なので、なんか新しくなったなぁぐらいにしか考えていなかったんですが、表示のされかたが異なるのは知らなかった。

せっかくなので iPad 対応しておくかといじってみたら、いきなりエラー。原因は、iPhone とは異なり iPad でははじめに表示される画面が detail なので、データが何もない状態で一覧を表示しようとすると detailItem が nil なので保存できずエラーとなっている。関連して、detail を表示した時、viewDidLoad が呼ばれないので configureView も呼ばれず、textView の例文そのまんま表示される(Lorem ipsum... みたいなやつ)、ボタン押し放題など、なんとも厄介な状況に。ようやく、解決方法がわかったらので後学のために書いておこうと思います。

まず、エラーの根本原因は MetailViewController に記載の、viewWillDisappear で毎回 save をかけていましたが、detailItem が nil の時は save しないようにしました。これでエラーは出なくなったけれども、ここがわかるまでが一苦労。

次に、初回表示の際、データがないのでボタンとかはいじって欲しくない。これは、awakeFromNib method に、以下の記載をすることで解決。

    self.view.userInteractionEnabled = NO;

通常、Master から detail に遷移した際は viewDidLoad method が呼ばれるので、ここでは YES を設定しておけばよい。

また、navigationItem.title が、なぜか Master となってしまうので、これは MasterViewController の awakeFromNib method でタイトルを指定してやることに。

ちなみに、textView の例文まで表示されてしまうのは、Main.storyboard に配置した textView の inspector で、例文が入っているのでカットすることで解決。

何度も言いますが、原因が分かれば直しようもあるのですが、原因がわかるまでが大変なもので、今回のも解決までに 3 日ぐらいかかりましたね。ふぅぅぅ。