1

if ()セグエの宛先View Controllerが詳細分割またはマスター分割に表示される かどうかを確認するステートメントをどのように表現できるか教えてもらえますか?

メソッドif()内にステートメントを入れたい。prepareForSegue:sender:

編集

(現時点で) この質問に関連するすべての詳細ビューはプロトコルに準拠しており、現在、次を使用して宛先コントローラーでイントロスペクションを実行しています。

if ([segue.destinationViewController conformsToProtocol:@protocol(myProtocol)])...

私が望むなら、これはうまくいかないことがわかります:

  1. splitView の Master または Detail のいずれかで同じクラスを時々、同時に表示できるようにするには...
  2. ビューが詳細分割で表示される場合にのみ、if() ステートメントが true になるようにします。

のようなものも役に立たsegue.destinationViewController.navigationController == ...ないようです。

セグエをセットアップするときに「マスター スプリット」または「ディテール スプリット」を設定する必要があるため、その情報にあまり迂回せずにアクセスする方法があることを期待していました。

2番目の編集:

イントロスペクションを使用してこれを設定する方法は「機能」します。あまり「オブジェクト指向」とは思えません。この情報についてView Controllerにクエリを実行する必要はまったくないと思います。VCがsplitViewのどちら側に表示されるかについて何も知らなければならない理由がわかりません。確かに、この情報を保持するオブジェクトはセグエであり、私が言うように、「詳細」または「マスター」分割を選択すると、これがストーリーボードに「設定」されているように見えます。

たぶんそれは何のプロパティでもないのですが、どうやってそれを手に入れるのかわかりません。

viewWillAppear で destinationViewController を照会して、画面に表示された後にどの NavigationController にあるかを調べることができると思いますが、これも少し「ハッキー」に思えます。

4

3 に答える 3

1

これを行うには、おそらく私が気付いていない、より抽象的で再利用可能な方法がありますが、特定のプロジェクトに関する特別な知識が少しだけ必要な特定のプロジェクトに役立つ可能性のある提案を次に示します。

セグエの準備でイントロスペクションを使用する場合は、responds to アプローチを使用してメソッドが存在するかどうかを確認できます。

したがって、たとえば、splitview コントローラーの一般的な実装 (すべてではないことに注意してください) では、詳細ビューは回転を処理するメソッドを実装します。したがって、プロジェクトでこれが当てはまる場合は、次のようにすることができます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([segue.destinationViewController respondsToSelector:@selector(splitViewController:shouldHideViewController:inOrientation:)]) {
    //do something
}

}

マスター ビューまたは詳細ビューのいずれかに関連する、プロジェクト内で固有であるが一定である何かに基づいて、この同じアプローチを使用できます。

お役に立てば幸いです。

于 2012-09-29T14:49:34.507 に答える
1

私の経験は少し限られていますが、ほとんどprepareForSegueの場合、ブロックは、新しいページの構築を処理するために特に実行する必要があることをすべてif()チェックします。segue.identifierすべてのセグエの識別子を設定すると、そのコントローラーからの各セグエを処理するコードを作成し、そのセグエが masterViewController または detailViewController に送られる場合にコードが依存するものを変更できます。うまく自動化された方法ではありませんが、仕事は完了します。

編集: うーん、その言葉遣いはちょっと紛らわしいです。もしよろしければ、コード例を載せることもできますが、それまでは Mac にアクセスできないので、月曜日まで待たなければなりません。

于 2012-09-29T15:11:31.613 に答える
0

クラスとプロトコルの話から別のアイデアが浮かびましたが、これが機能するかどうかはわかりません。投稿する前にテストしたかったのですが、すぐにテストする時間がありません。

UIViewController のサブクラスである 2 つの新しいクラス、UIMasterViewController と UIDetailViewController を作成できるはずです。次に、実際の画面ごとに、UIViewController のサブクラスを直接作成する代わりに、UIDetailViewController または UIMasterViewController のいずれかを作成します。次に、あなたprepareForSegue

if ([segue.destinationViewController isKindOfClass:UIMasterViewController])
{
  //do master view specific stuff
}
else if ([segue.destinationViewController isKindOfClass:UIDetailViewController])
{
  //do detail view stuff here
}

カスタムView Controllerクラスを正しく設定できる限り、これはセグエがどこに送信されているかを知るための非常に信頼できる方法です。これでも、質問に記載されている最初の問題は解決されません

  1. 「splitView の Master または Detail のいずれかで同じクラスを時々、同時に表示できるようにするには...」

これは、いずれかまたは両方として表示できるようにしたいすべてのビューの 2 つのコピーを作成し、1 つを UIMasterViewController に、もう 1 つを UIDetailViewController にすることで克服できます。

これが機能するかどうか教えてください - 頭のてっぺんからコントローラーをセットアップする方法が正確にはわかりませんが、それができると確信しています. 可能であれば、これは非常に便利なことだと思います。

于 2012-10-02T16:44:42.347 に答える