6

Interface Builder で View Controller nib のデフォルトの View Outlet を設定する際に問題があります。これが私のセットアップです:

ナビゲーション コントローラーをモーダル ビューとして読み込む TabBar ベースのアプリケーションがあります。

MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc]initWithNibName:@"MenuController" bundle:nil];
[tabBarController presentModalViewController:menu animated:anim];

MenuController 自体は次のように構成されています。

MenuController.xib
  ファイルの所有者 (MyNavCtrlrSubClass : UIViewController)
  ナビゲーションコントローラー (UINavigationController)
    ナビゲーション バー (UINavigationBar)
    ルート ビュー コントローラー (Nib 名は AnotherViewController.nib をロードするように設定されています)
      ナビゲーション項目 -> (UINavigationItem)

MyNavCtrlrSubClass が読み込まれるときに次のエラーが発生することを除いて、これはすべて正常に機能します。

Loaded the "MenuController" nib but the view outlet was not set

これが起こっている理由は明らかです。ファイルの所有者には、そのビューのアウトレット接続がありません。問題は、そのビューとして何を設定する必要があるかということです。そもそも何かを設定する必要がありますか? Navigation Bar は MenuController.xib の唯一の候補ですが、これを行うと、いわば UINavigationBar 自体のサイズがフルスクリーン モードになります。

私は明らかにIBで何かが欠けていますが、何ですか?MyNavCtrlrSubClass.m には、UINavigationController の IBOutlet を除いて、コード自体はありません。IB でこれを完全に設定しようとして間違いを犯していますか? アイデアは、モーダル ナビゲーション コントローラーを 1 つのペン先に保持し、それがロードするすべてのビューを別々のペン先に保持することですが、MenuController はナビゲーションの単なるコンテナーであり、ビュー自体は含まれていないため、明らかに設計が間違っています。:)

なぜ私が別の方法で設計しないのか疑問に思っているのであれば、それは、理想的な階層を構築するよう IB がどのように求めているかについて、私の (おそらく間違った) 認識に従おうとしているからです。

どんな助けでも大歓迎です。

4

3 に答える 3

5

ファイルの所有者がNIBファイルでどのように使用されることを意図しているかを理解していない可能性があると思います。別の質問の下に、ファイルの所有者を説明する回答を書きました。

この行を呼び出すと、次のようになります。

[[MyNavCtrlrSubClass alloc] initWithNibName:@"MenuController" bundle:nil]

MyNavCtrlrSubClass のインスタンスを作成し、@"MenuController" をロードするように指示します。次に、MenuController.xib ファイルには、関連のない 2 番目の UINavigationController があり、その中に物があります。実行時に MenuController.nib がロードされると、その 2 番目のナビゲーション コントローラーが作成されます。

2 つ目の問題は、UINavigationController に NIB ファイルをロードするように指示することは、実際には賢明ではないということです。これは、ナビゲーション コントローラーが独自のビューを作成および管理するためです。ルート ビュー コントローラーを作成し、そのビュー コントローラーに NIB ファイルをロードするように指示します。

これを試して:

MyRootViewController *rootController = [[[MyRootViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil] autorelease];
MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc] initWithRootViewController:rootController];

XIB ファイルは次のようになります。

  • ファイルの所有者 (MyRootViewController に設定されたクラス、後続の UIView に接続されたビュー アウトレット)
  • UIView
    • サブビュー A
    • サブビュー B

このすべての動作に慣れたら、投稿したコードで始めたように、ナビゲーション コントローラーとルート ビュー コントローラーを 1 つの XIB ファイルでインスタンス化することも検討してください。

于 2009-06-03T03:14:41.050 に答える
1

この質問の核心は、Travis自身によって述べられています:「InterfaceBuilderで可能な限り設計し、Navigation Controllerペン先をどのようにロードしますか?」また、例から、これはUINavigationControllerおよび関連するUIViewControllerを意味するように見えます。

この解釈では、答えは、単一のXIBでUINavigationControllerとそのUIViewControllerを完全に構成することはできないということです。はい、あなたが夢中にならないようにこれをやりたいのは直感的です。

私があなたがこれを行うことができないと言うとき、私は最も一般的に使用されるフレームワークメソッドがこれを処理する方法を持っていないことを意味します。[UINavigationControlleralloc]initWithMegaNibNameはありません。はい、ほとんどすべてのものを1つのXIBに詰め込み、特別な方法でオブジェクトをハイドレイトするコードを記述できますが、それがあなたが探しているものではないと思います。

Jonが提案したように、2つ以上のXIBを使用することもできますが、そうすると、自己完結型ではなくなるため、コードでコントローラーの一部またはすべてを実行する方が簡単だと感じる人がたくさんいます。

残念ながら、他の開発プラットフォームのように、Interface Builderの機能とコードの間に1:1の対応はありません。私は一般的に、デザイナーがアセットの作成にできるだけ参加できるようにすることを好みますが、私が知っているほとんどのデザイナーは、Objective-cをコーディングしていません。

于 2011-04-19T21:51:00.873 に答える
0

IBでは、MenuControllerペン先にUIViewを追加し、そのビューをアウトレットとして設定します。UIViewControllerにそのビューを設定する必要があります。 これは、基本的な設定を示すAppleページへのクイックリンクです。しかし、それがあなたの現在の段階であなたを助けるかどうかはわかりません。

于 2009-06-02T18:28:11.343 に答える