2013-04-05 13 views
6

UIViewControllerにnibファイルをロードする方法を試しています。nibファイルをUIViewController内にロードする

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

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

これはうまくいきませんでした。また、私はという表現の結果を使用していないという警告を受けました

そして、私は、インターネット上で検索し、this記事に出くわしたので、同様に説明するようにloadView方法を実装し、

- (void)loadView 
{ 
    [super loadView]; 

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

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

誰でも私がここで見落としていることと、これをどうやって行うことができるのか教えていただけますか?

ありがとうございます。

UPDATE:

まず第一に、すべての応答に感謝します。しかし、voromaxsvenaの答えは、私が大好きではないセグとロード・ペンを自動的にはずすべきだと示唆している。 Anilの答えが見つかるようになりました。そして今、私はジャンプするための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に送信された認識できないセレクタ' *

このエラーはなぜ起こりますか?それが不可能な場合は、私は提案に開放されています。

もう一度おねがいします。そして、ちょっとこれを少しドラッグして申し訳ありません。

+0

に応じて、単一のペン先を読み込みます – voromax

答えて

1

ビューコントローラのペン先からそのビューコントローラのペン先をロードすることは想定されていません。

nibからView Controllerをインスタンス化する場合は、そのView Controllerの外から、通常はそれを表示するView Controllerから行います。

すでにコンセント接続が設定されている提示されたView Controller内のフックを探している場合は、-awakeFromNibを無効にするのが一般的です。 -viewDidLoadが別です。

更新#1

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
{ 
    if (/*do your segue identification stuff*/) { 
     UIViewController *myViewController = /*init your view controller here*/ 
     UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myViewController]; 
     [self presentViewController:navigationController animated:YES completion:nil]; 
     return NO; 
    } 
    return YES; 
} 
+0

直前のView Controllerには 'UITableViewController'があります。そのため、Segueが発生する直前にインスタンスを作成する際にペン先をロードしようとしました。 'NewMailViewController * newMailVC = [[NewMailViewController alloc] initWithNibName:@"電子メール "バンドル:nil]; newMailVC = [segue destinationViewController]; 'しかし、動作しませんでした。 – Isuru

+1

あなたのコメントから私はストーリーボードを使用していると結論しました。ストーリーボードはあなたのためにあなたのビューコントローラをインスタンス化し、あなたはそれらのペン先を自分でロードしません。あなたがストーリーボードを使ってペン先からロードすることに戻る理由がありますか? – svena

+0

はい、ストーリーボードを使用しています。申し訳ありませんが、私はその質問に言及すべきでした。シナリオはこのようなものです。カスタムメールアプリケーションを作成していますが、複数のメールタイプがあります。各メールタイプについて、UIは異なります。だから、私がしたことは、各メールタイプごとに個別のペン先を作成し、メールタイプをリストアップするための 'UITableViewController'を持っています。そして、ユーザの選択に応じて、' UIViewController'に特定のnibファイルをロードします。 – Isuru

1

あなたは、ビューコントローラ自体私をインスタンス化するために、nibファイルを使用する必要があります。 e。あなたはすべてのビューコントローラを作成した方がよいアプリケーションロジックによってロードされるべきかを表示コントローラを選択する必要がある場合は、このコントローラー場合

更新

を提示することができた後

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

1つのストーリーボードでは、ハードセグメントバインドをスキップし、ストーリーボードインスタンスのinstantiateViewControllerWithIdentifier:メソッドを使用して、適切なView Controllerを取得し、手動で表示します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    if (APPROPRIATE_INDEX_PATH) { 
     UIViewController *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:IDENTIFIER]; 
     [self.navigationController pushViewController:ctrl animated:YES]; 
    } 
} 
+0

直前のビューコントローラーとして 'UITableViewController'があるので、セグが起こる直前にインスタンス化するときにペン先をロードしようとしました。 'NewMailViewController * newMailVC = [[NewMailViewController alloc] initWithNibName:@"電子メール "バンドル:nil]; newMailVC = [segue destinationViewController]; 'しかし、動作しませんでした。 – Isuru

+1

あなたは ' - shouldPerformSegueWithIdentifier:sender:'によってこのセグを取り消して、NOを返してコントローラを手動でロードすることができます – voromax

9

- (void)loadView 
{ 
[super loadView]; 

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

編集をペン先からビューをロードし、View Controllerのビューとして使用するには、以下のコードを使用します。私はあなたのテーブルビューコントローラがナビゲーションコントローラにすでにあることを前提としてい

ユーザーの選択に応じて1つのペン先を取り付けます。単一のペン先のロードを参照してください。

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

はオブジェクトの配列を返します。更新された質問から、これらの配列を別の配列に格納しているのが分かります。今度はあなたのペン先配列は '配列'オブジェクトの配列です。

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

となります。

しかし、それは良いではありません、あなたはまだ更新の答えを参照してください...誰もがすべてのコメントを読んでます、あなたの質問でストーリーボードやカスタムロジックをしませ言及しなかったユーザーの一品

+0

応答をありがとう。このメソッドは機能し、私は副次的な質問があります。私は複数のnibファイルを持っています。ユーザーの選択に応じて、特定のペン先をロードする必要があります。だから私が試みたのは、[this](http://pastebin.com/rcpHTTSY)のように配列の中にすべてのペン先を入れて、この 'self.view = [nibs objectAtIndex:1];'というインデックスを使ってアクセスすることでした。しかし、キャッチされていない例外 'NSInvalidArgumentException'のために_Terminatingアプリケーションが発生しました。理由: ' - [NSArrayM _setViewDelegate:]:認識できないセレクタがインスタンスに送信されました0xd56fd20'_何かが見つからない、または別の方法がありますか? – Isuru

+0

質問に沿ってコードを投稿できますか?私はそのページにアクセスできません。実際には、nib配列は__loadNib__によって返されます。ビューだけでなく、nib(buttons/label ..)のすべてのコントロールが含まれます。objectAtIndex [0]はトップレベルのオブジェクトになります(単一のビューペン先)。あなたのコードを見て私は正確な問題を言うことができません –

+0

私は上記の私の質問を更新しました。 – Isuru

関連する問題