6

nibファイルをにロードする方法を実験していますUIViewController

Emailという別の nib ファイルを作成しました。initWithNibName最初に、View Controller がロードされたときにメソッドが呼び出されないことに気付きました。だから私はviewDidLoadこのように手動でメソッドから呼び出しました、

[self initWithNibName:@"Email" bundle:[NSBundle mainBundle]];

それは動かなかった。また、 Expression result usedという警告が表示されました。

で、ネットで検索してこの記事にたどり着き、loadView説明通りの方法で実装したところ、

- (void)loadView
{
    [super loadView];

    UINib *nib = [UINib nibWithNibName:@"Email" bundle:nil];
    [nib instantiateWithOwner:self options:nil];
}

メソッドが呼び出されますが、まだビュー コントローラーは空です!

ここで見落としていることと、これを行う方法を誰か教えてもらえますか?

ありがとうございました。

アップデート:

まず、すべての応答に感謝します。ただし、 voromaxsvenaの回答は、私があまり好きではないセグエを削除してニブを自動的にロードする必要があることを示唆しています。Anil's answer works find で、ジャンプする最後のハードルが 1 つあります。

複数の nib ファイルがあります。ユーザーの選択に応じて、特定のペン先をロードする必要があります。だから私が試したのは、すべてのニブを配列の中に入れて、

- (void)loadView
{
    [super loadView];

    NSArray *nibs = [[NSArray alloc] initWithObjects:
                     [[NSBundle mainBundle] loadNibNamed:@"Facsimile" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"Email" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"Memorandum" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"ProjectMemo" owner:self options:nil], nil];


    self.view = [nibs objectAtIndex:0];
}

このようなインデックスを使用してアクセスしますself.view = [nibs objectAtIndex:1];。しかし、それはエラーをスローします * キャッチされない例外 'NSInvalidArgumentException' によるアプリの終了、理由: '-[__NSArrayM _setViewDelegate:]: 認識されないセレクターがインスタンス 0xd56fd20 に送信されました'*

このエラーが発生するのはなぜですか? それが不可能な場合は、提案を受け付けています。

再度、感謝します。そして、これを少し引きずってすみません。

4

3 に答える 3

9

以下のコードを使用して nib からビューをロードし、View Controller のビューとして使用します

- (void)loadView
{ 
[super loadView];

NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil];
self.view = [nib objectAtIndex:0];
}  

編集

ユーザーの選択に従って単一のペン先をロードします。単一のペン先のロードを参照してください

    NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil];  

オブジェクトの配列を返します。更新された質問から、これらの配列を別の配列に格納していることがわかります。これで、nib 配列は「配列」オブジェクトの配列になりました。

 self.view = [[nibs objectAtIndex:0]objectAtIndex:0]; 

動作します。

しかし、それは良くありません。ユーザーの選択に応じて単一のペン先をロードします

于 2013-04-05T07:59:52.823 に答える
1

ビュー コントローラ自体をインスタンス化するには、nib ファイルを使用する必要があります。

UIViewController *ctrl = [[UIViewController alloc] initWithNibName:@"Email" bundle:nil];

その後、このコントローラーを提示できます

アップデート

アプリケーション ロジックによってロードされるビュー コントローラーを選択する必要がある場合は、すべてのビュー コントローラーを 1 つのストーリーボードに作成し、ハード セグエ バインディングをスキップしてinstantiateViewControllerWithIdentifier:、ストーリーボード インスタンスのメソッドを使用して適切なビュー コントローラーを取得し、表示することをお勧めします。手動で。あなたのTable View ControllerはすでにNavigation Controllerにあると思います:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    if (APPROPRIATE_INDEX_PATH) {
        UIViewController *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:IDENTIFIER];
        [self.navigationController pushViewController:ctrl animated:YES];
    }
}
于 2013-04-05T07:47:45.797 に答える