[解決済み] iPhoneのポートレートでUISplitViewControllerを使用すると、マスターではなく詳細VCが表示される
質問
Xcode 6でiOS 7以降をターゲットにしたユニバーサルストーリーボードを使用しています。私は
UISplitViewController
これは現在、iOS 8 を実行している iPhone でネイティブにサポートされており、Xcode は自動的に iOS 7 用にバックポートします。とてもうまくいっているのですが、iOS 8を搭載したiPhoneのポートレートでアプリを起動すると、最初にマスタービューコントローラーが表示されると思ったのに、スプリットビューの詳細ビューコントローラーが表示されることがあります。iOS 7でアプリを実行すると、正しくマスタービューコントローラーが表示されるので、これはiOS 8のバグだと信じていたのです。しかし、iOS 8はGMになり、まだこの現象が起きています。分割ビューコントローラを折りたたむ(画面にビューコントローラを1つだけ表示する)場合、分割ビューコントローラを表示すると、詳細ではなくマスタービューコントローラを表示するようにするには、どのように設定すればよいでしょうか。
Interface Builderでこのような分割ビューコントローラを作成しました。分割ビューコントローラは、タブバーコントローラの中の最初のビューコントローラです。マスターと詳細の両方のVCは、内部にテーブルビューコントローラを埋め込んだナビゲーションコントローラです。
どのように解決するのですか?
やれやれ、これは数日間頭痛の種で、どうすればいいのか分かりませんでした。 最悪だったのは、マスター・ディテールのテンプレートで新しいXcode iOSプロジェクトを作るとうまくいったことです。 幸いなことに、最終的にはその小さな事実が解決策を見出す方法となりました。
私が見つけたいくつかの投稿によると、解決策は、新しく実装された
primaryViewControllerForCollapsingSplitViewController:
メソッドを
UISplitViewControllerDelegate
. それを試してみたが、無駄だった。 Appleがマスター・ディテールのテンプレートでやっていることで、うまくいきそうなのは、新しい(この1つをすべて言うために深呼吸してください)実装です。
splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:
デリゲートメソッド(これも
UISplitViewControllerDelegate
). によると
ドキュメント
, このメソッドです。
プライマリビューコントローラを調整し、セカンダリビューコントローラを折りたたまれたインターフェイスに組み込むよう、デリゲートに依頼します。
具体的な内容は、そのメソッドのディスカッションの部分を必ず読んでください。
アップルの対応方法は
- (BOOL)splitViewController:(UISplitViewController *)splitViewController
collapseSecondaryViewController:(UIViewController *)secondaryViewController
ontoPrimaryViewController:(UIViewController *)primaryViewController {
if ([secondaryViewController isKindOfClass:[UINavigationController class]]
&& [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]]
&& ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) {
// Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return YES;
} else {
return NO;
}
}
この実装では、基本的に以下のことを行います。
-
もし
secondaryViewController
は私たちが期待しているものです(aUINavigationController
を表示し、私たちが期待しているもの(a)を表示しています。DetailViewController
-- あなたのビューコントローラ) が、モデルを持たない (detailItem
) の場合、"Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
"。 -
それ以外の場合は、" を返します。
NO
を使用して、分割ビューコントローラがセカンダリビューコントローラのコンテンツを折りたたまれたインターフェイスに組み込んでみるようにします"。
結果は、iPhoneのポートレート(ポートレートで起動するか、ポートレートに回転する--より正確にはコンパクトなサイズクラス)の場合、次のようになります。
-
正しく表示されている場合
- を表示し、モデルを持つ場合は、詳細ビューコントローラを表示します。
- が、モデルを持っていない場合、マスタービューコントローラを表示します。
-
ビューが正しくない場合
- マスタービューコントローラーを表示する
泥のように澄んでいる。
関連
-
[エラー処理】iOSのエラー、アーキテクチャx86_64の未定義シンボルについて
-
[解決済み] Xcode 6.3 - 現在の iOS Development 証明書または保留中の証明書要求がすでにあります。
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] IBOutletsはARCのもとで強くなるべきか、弱くなるべきか?
-
[解決済み] iOS Simulatorでネットワークを無効にすることは可能ですか?
-
[解決済み] Swift 3でディスパッチキューを作成する方法
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] UITableViewCell、スワイプ時に削除ボタンを表示させる
-
[解決済み] IBOutletsはARCのもとで強くなるべきか、弱くなるべきか?
-
[解決済み] SwiftでUIAlertViewを作成するにはどうしたらいいですか?
-
[解決済み] UINavigationBarの1px下の行を非表示にする方法
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン