Controllerの使い方。ボタンでマスター部を出し入れする方法。Controllerの使い方。ボタンでマスター部を出し入れする方法。Controller(以下、スプリットビューコントロラー)を使って画面をマスター部とディテール部に分割する方法を説明した。⇒「前回記事」その記事の実装では、マスター部を引き出すときは画面端から内側に向かってドラッグした。画面端からドラッグはやりづらいので、ドラッグ以外の方法で出し入れしたいと思うことがある。そこで本記事では、ボタンを押してマスター部を出し入れする実装方法を説明する。具体的には、ナビゲーションバーの左端にボタンを表示し、ボタンを押してマスター部を出し入れできるようにする。以降の作業は前回記事の実装結果から行う。前回記事の実装結果のXcodeプロジェクトをGitHubに置いたので、試してみる人はご利用されたし。前回記事の実装では、下図のようにディテール部はナビゲーションコントローラーを介さずにビューコントローラーをそのまま起動した。上図のままではiPadで起動したときにディテール部にナビゲーションバーが存在しないので、下図のようにディテール部もナビゲーションコントロールを介して起動するようにこれから変更する。Controller」を選択する。すると、ビューコントローラーと接続したナビゲーションコントローラーが作られる。TestTableViewController.swiftを以下のコードに変更する。viewDidLoadメソッドで、ナビゲーションバーの左ボタンに画面モード切り替えボタンを配置している。widthの端末では機能しない。そのため、戻るボタンを切り替えボタンに置き換えてしまうと、iPhoneで起動したときにナビゲーションバーに何も表示されなくなる。呼び出しメソッド」でキャストするクラスをナビゲーションコントローラーに変更し、ナビゲーションコントローラーからビューコントローラーを取得して、画像ファイル名を設定するようにした。//ナビゲーションバーの左ボタンに画面モードの切り替えボタンを表示する。//戻るボタンの後ろに表示する。//セルを取得し、テキストを設定して返す。//遷移先のナビゲーションコントローラーからビューコントローラーを取得し、画像を設定する。{super.viewDidLoad()//ナビゲーションバーの左ボタンに画面モードの切り替えボタンを表示する。splitViewController?.displayModeButtonItem()//戻るボタンの後ろに表示する。{//セルを取得し、テキストを設定して返す。{//遷移先のナビゲーションコントローラーからビューコントローラーを取得し、画像を設定する。tableData[selectedRowIndexPath.row]}}}}ViewController.swiftを以下のコードに変更する。先ほどと同じように、viewDidLoadメソッドでナビゲーションバーの左ボタンに画面モード切り替えボタンを設定している。//戻るボタンの後ろに表示する。//ナビゲーションバーの左ボタンに画面モードの切り替えボタンを表示する。{super.viewDidLoad()//画像を設定する。imageName)}//戻るボタンの後ろに表示する。true//ナビゲーションバーの左ボタンに画面モードの切り替えボタンを表示する。splitViewController?.displayModeButtonItem()}}以下はiPadのプレイ動画。ナビゲーションバーの左ボタンを押してマスター部を出し入れできるようになった。以下はiPhoneのプレイ動画。こちらは変更前と何も変わらない。AppDelegateで切り替えボタンを設置する上記コードは、各クラスでナビゲーションバーの切り替えボタンを設定したが、複数画面で共通して使われるナビゲーションバーの設定を各クラスで設定し直すのはスマートではない。通常、このような設定はAppDelegateで一括して設定する。Detail」のセグエを使って画面遷移させると、ディテール部の画面が置換されるため起動時に設定したナビゲーションバーのアイテムが消えてしまう。そこで、セグエを使わずにディテール部を変更することにした。(※もっとスマートな方法が見つかった場合はわかり次第追記する。)セルとナビゲーションコントローラーを接続したセグエ(下図赤枠)を選択し、Deleteキーで削除する。AppDelegate.swiftを以下のコードに変更する。アプリ起動時に、マスター部とディテール部のナビゲーションバーに切り替えボタンを追加している。マスター部のデリゲート先にディテール部のビューコントローラーを設定し、セルがタップされたときのイベントをマスター部からディテール部に渡せるようにした。//スプリットビューコントローラーを取得する。//マスター部のテーブルビューコントローラーを取得する。//新しいボタンは戻るボタンの横に追加されるように設定する。//マスター部のナビゲーションバーの左ボタンに画面モードの切り替えボタンを追加する。//ディテール部のビューコントローラーを取得する。//新しいボタンは戻るボタンの横に追加されるように設定する。//ディテール部のナビゲーションバーの左ボタンに画面モードの切り替えボタンを設定する。//マスター部のデリゲート先にディテール部のビューコントローラーを設定する。{//スプリットビューコントローラーを取得する。UISplitViewController//マスター部のテーブルビューコントローラーを取得する。TestTableViewController//新しいボタンは戻るボタンの横に追加されるように設定する。true//マスター部のナビゲーションバーの左ボタンに画面モードの切り替えボタンを追加する。splitViewController.displayModeButtonItem()//ディテール部のビューコントローラーを取得する。ViewController//新しいボタンは戻るボタンの横に追加されるように設定する。true//ディテール部のナビゲーションバーの左ボタンに画面モードの切り替えボタンを設定する。splitViewController.displayModeButtonItem()//マスター部のデリゲート先にディテール部のビューコントローラーを設定する。{}}TestTableViewController.swiftを以下のコードに変更する。ViewControllerに適用するプロトコル(TestTableViewControllerDelegate)を新しく作成した。「データ選択時の呼び出しメソッド」で、ディテール部のデリゲートメソッドを呼び出したあとにディテール部の画面表示に切り替えている。//セルを取得し、テキストを設定して返す。//デリゲートメソッドを呼び出す。//ディテール部を表示する。{//セルを取得し、テキストを設定して返す。{//デリゲートメソッドを呼び出す。{//ディテール部を表示する。nil)}}}ViewController.swiftを以下のコードに変更する。上記で作成したプロトコルを適用し、デリゲートメソッドの「セル選択時の呼び出しメソッド」でイメージビューに画像を設定している。{super.viewDidLoad()//画像を設定する。image}}以下はiPadのプレイ動画。前回の実装と動きは同じ。以下はiPhoneのプレイ動画。前回の実装と動きは同じ。自分好みのボタンに変える。マスター部を出し入れするボタンを自分好みの画像や文字列にするとき、そのまま設定すると以下の動画のようにiPhoneで起動したときに「戻るボタン」の横に切り替えボタンが表示され、しかもiPhoneでは切り替えボタンは機能しないので、何もできないボタンが表示されるだけになる。widthで起動されているときのみボタンを追加する作りに変更する。AppDelegate.swiftを以下のコードに変更する。その他のファイルは変更無し。widthの端末で起動されたと判断し、アイコンを設定したボタンを左ボタンに登録している。//スプリットビューコントローラーを取得する。//マスター部のテーブルビューコントローラーを取得する。//ディテール部のビューコントローラーを取得する。//起動時の画面モードからボタンを追加するかどうかを決める。//新しいボタンは戻るボタンの横に追加されるように設定する。//ボタンを作成する。//マスター部のナビゲーションバーの左ボタンに画面モードの切り替えボタンを追加する。//新しいボタンは戻るボタンの横に追加されるように設定する。//ボタンを作成する。//ディテール部のナビゲーションバーの左ボタンに画面モードの切り替えボタンを設定する。//マスター部のデリゲート先にディテール部のビューコントローラーを設定する。{//スプリットビューコントローラーを取得する。UISplitViewController//マスター部のテーブルビューコントローラーを取得する。TestTableViewController//ディテール部のビューコントローラーを取得する。ViewController//起動時の画面モードからボタンを追加するかどうかを決める。{//新しいボタンは戻るボタンの横に追加されるように設定する。true//ボタンを作成する。splitViewController.displayModeButtonItem().action)//マスター部のナビゲーションバーの左ボタンに画面モードの切り替えボタンを追加する。closeButton//新しいボタンは戻るボタンの横に追加されるように設定する。true//ボタンを作成する。splitViewController.displayModeButtonItem().action)//ディテール部のナビゲーションバーの左ボタンに画面モードの切り替えボタンを設定する。openButton}//マスター部のデリゲート先にディテール部のビューコントローラーを設定する。{}}以下はiPadのプレイ動画。システムアイコンのボタンが表示された。以下はiPhoneのプレイ動画。システムアイコンは表示されず、いつもの戻るボタンが表示された。【Swift】Segueの使い方。遷移先のビューコントローラーにデータを渡す。...【Swift】Segueの使い方。シーンとシーン接続して画面遷移をする。画面下部にボタンを並べるための部品。スペースを調整してバーにアイコンを並べる。Controllerの設定。ナビゲーションバーのタイトルをビューコントローラーと合わせる。AM初めまして、ちきと申します。いつも参考にさせて頂いております。SplitViewControlerについて質問させてください。Controllerをタブに追加して実行したところ、SplitView以外のタブ(サンプルではFirstView)で端末を回転させるとコンソールに下記のエラーが表示されます。0.何か回避方法などがあれば、ご教授願いますでしょうか。お忙しいところ恐れ入りますがよろしくお願いいたします。PlusやiPadの場合に顕著なようです。PMはじめまして参考にして頂きありがとうございます^^明確な回答はできませんが、まずは原因を特定するために、サンプルで使っている画像を1つずつ減らして実行してエラーが出なくなるのかを確認してみてはどうでしょう。PMご回答ありがとうございます。私もImage作成に問題があるものと思い、削除してみたのですが原因が特定できず、新規に作成して画像を全く使用していない状態でも同じエラーが出たので相談した次第です。実機ではエラーが出ないので放置しようかと思っていたのですが、TabにSplitViewを追加してさらにViewControllをスタックすると戻った後に画面が表示されないなど、期待通りに動かないので使用するのを諦めました。(Tabを使用せずSplitViewだけなら問題なく動きます)初心者には少し荷が重かったので、最初は単純な画面構成にして慣れてきたら色々やってみようと思います。お忙しいところありがとうございました。コメントをキャンセルメールアドレスが公開されることはありません。