-1

ビューをXIB含むファイルがあります。そのビューで、カスタム オブジェクトを追加し、それらのオブジェクトを取得して、他のものをクレートする場所にあるビュー コントローラーでそれらを使用したいと考えていますprogrammatically

私のXIBファイルは"MyXibLibrary.xib" 私がオブジェクトを追加したい私のビューコントローラと呼ばれています"ContactDetailsViewController"

私のView Controllerは次のようにプッシュされていUITableViewControllerます:

 ContactDetailsViewController *detailViewController = [[ContactDetailsViewController alloc] init];

そして、ContactDetailsViewController viewWillAppear私の内部には、XIB オブジェクトを取得するための次のコードがあります。

 UIView *xibView = [[[NSBundle mainBundle] loadNibNamed:@"MyLib" owner:self options:nil] objectAtIndex:0];
    [self.view addSubview:xibView];

さて、たとえば、loadNibNamedプロパティはどうあるべきですか? XIBファイルの名前? そのXIBファイルのビューの名前? または何?

これらすべてがエラーを引き起こし、アプリが例外を引き起こします。

私はコーディングが初めてなので、XIBファイルの操作方法についてはまったくわかりませんObjective-c

どんな助けでも本当に感謝します!!! ありがとう!

4

4 に答える 4

4

(歴史の問題として) NIB と呼ばれる XIB は、View Controller によって「制御」される少なくとも 1 つのビューを定義します。このビューは、ユーザー インターフェイス全体を表すことも、単に別のビューのサブビューを表すこともできます (たとえば、XIB は再利用可能なテーブル行を表すことができます)。したがって、説明した方法で、事前に構築されたインターフェイス要素の一種のコンテナーとして XIB を使用しないでください。

ただし、コントローラーがそれらを認識していれば、XIB のコンポーネントを操作するのは簡単です。つまり、XIB の要素はビュー コントローラー クラスのプロパティに接続する必要があります。

たとえば、次のビュー コントローラー インターフェイスがあるとします。

#import <UIKit/UIKit.h>

interface MyViewController : UIViewController { 
}

@property (strong, nonatomic) IBOutlet UITextView *textEntry;
@property (strong, nonatomic) IBOutlet UIButton *enterButton;

対応する NIB の名前はMyView.xib. インターフェイス ビルダーで、NIB の「ファイルの所有者」を「MyViewController」に設定します。次に、インターフェース要素である UITextView と UIButton を MyViewController のプロパティにリンクします (任意の方法で - 通常はオプション + クリック & インターフェース要素からファイルの所有者オブジェクトにドラッグします)。

これを行うと、好きな場所でView Controllerをインスタンス化し、そのオブジェクトのプロパティを操作できます。たとえば、このコードが「SomeOtherController.m」という名前のファイルにあるとしましょう。

- (void)aMethodOfSomeOtherController
{
  MyViewController *myView = [[MyViewController alloc] 
                              initWithNibName:@"MyViewController" 
                              bundle:nibBundleOrNil];

  NSString *buttonLabelText = [[[myView] enterButton] titleLabel] text];
  NSLog(@"Button label text = %@", buttonLabelText);

  [myView release];
}

このメソッドが呼び出されるとMyViewController、格納されたオブジェクトを NIB から自動的にロードし、View Controller オブジェクトのプロパティにバインドする のインスタンスが作成されます。次に、ボタンのラベルのテキストを取得し、ログ コンソールに書き込みます。

于 2012-11-12T13:40:03.070 に答える
2

のドキュメントをUIViewController見ると、と呼ばれるメソッドがありinitWithNibName:bundle:ます。xibファイルとビューコントローラの使用方法を示すためにAppleが提供する5つの異なるサンプルコードプロジェクトがリストされています。基本的な理解を得るために、それらのいくつかを読む必要があります。

于 2012-11-12T12:44:03.237 に答える
2

NIBからロードする場合はUIView、このコードの方が適切です (xib ファイル内の必要なオブジェクトのインデックスがわからないため)。

- (id)loadViewFromNIB:(NSString *)nibName owner:(id)owner class:(Class)_class
{
    NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:nil];

    for (id object in objects) {
        if ([object isKindOfClass:_class]) {
            return object;
        }
    }
}
于 2012-11-12T12:47:52.720 に答える
-1

インターフェイス ビルダーで MyLib.xib を開き、そのファイルに実際に UIView コンポーネントがあることを確認します。

例外からどのようなエラー メッセージが表示されますか?

于 2012-11-12T13:02:26.110 に答える