2013-09-25 17 views
7

私はこのようなビューコントローラルート要素とペン先を持っている:トップレベルのViewControllerでXIBを読み込む方法は?

enter image description here

私は、自動レイアウトを使用して、上部と下部レイアウトガイドに対して要素を位置決めすることができます。ファイルの所有者という、

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "SearchViewControllerPro" nib but the view outlet was not set.'

は、それが私に指摘されたエラーをグーグル:私は最初

SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]]; 

を使用して、このペン先をロードしようとしたとき、私は次の実行時例外が発生しました

のxibをビューコントローラのクラスに設定する必要があり、ビューコンセントをxibのビューオブジェクトに設定する必要がありました。私がそうするならば、私は次の実行時エラーを取得:ビューは、ファイルの所有者とペン先のトップレベルのビューコントローラの両方に関連付けられているので、

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View > is associated with . Clear this association before associating this view with .'

は驚きと来ません。しかし、実際には2つの別個のエンティティではなく、まったく同じことを実行時にどのように伝えることができますか?

編集:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.

一時的な解決策:

私はそうのようなペン先からのViewControllerをunpckしようと、

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject]; 

を、それは良いのいずれかを実行しません

解決策が見つかりましたが、それほど美味しくありません。 IBに示す構造にもかかわらず、ビューコントローラはxibの最後のオブジェクトではありません。だから私は持っています:

__block SearchViewControllerPro* mapSearchViewController = nil; 
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[SearchViewControllerPro class]]) { 
     mapSearchViewController = obj; 
    } 
}]; 

これは実行時のクラッシュなしで動作するようです。しかし、それはクリーンなコード以外はすべてです。

+0

..あなたは、あなたのペン先のエラーを持っています。クラス名が正しいことを確認し、間違った接続を手動で切断する必要があります。あなたはFilesOwnerのクラスとして何を設定しましたか? FilesOwnerにどのような接続をしましたか? – hooleyhoop

+0

[NSBundle mainBundle] loadNibNamed:...またはSearchViewControllerPro alloc] initWithNibName:を実行するかどうかによって変わることがわかっている限り、FilesOwnerのクラスをどのように設定するかは関係ありません。読み込み方法を変更した場合、FilesOwnerは無効になります(クラッシュします) – hooleyhoop

答えて

4

how can I tell the run-time that they are both in fact the very same thing instead of two separate entities?

これは同じものではないためできません。 2つのSearchViewControllerProインスタントを作成しました。

SearchViewControllerProインスタンスをalloc-initするか、nibからunarchiveする必要があります。

ペン先でViewControllerを作成する場合は、ペン先に作成する他のアイテム(ビュー、ボタン、テキストフィールド)にアクセスするのと同じ方法でアクセスします。

アウトレットをFilesOwnerオブジェクトに追加し、インタフェースビルダーで接続をフックアップし、ペン先のアーカイブを解除するときにオブジェクトを渡すようにしてください。

例えば、あなたがしたい場合FilesOwnerなるようにペン先をunarchivesオブジェクト:

[[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:self options:nil]; 
+0

あなたの答えをありがとう。私はそれを理解するか分からない。私はちょうどペン先の中から '' ViewController''を取り出しようとしましたが、そこには運がありませんでした(上記の私の編集を参照してください)。あなたのコメントに:はい、私は今知っている、私は2つのインスタンスがあります。私が言っていたことは、私は同じオブジェクトにそれらを解決し、IBやコードでそれを行う方法を知らないことです。なぜなら、alloc-initingが失敗するからです(上記のエラーを参照)。 – Chris

+0

「2つのインスタンスを同じオブジェクトに解決する」とはどういう意味ですか?私が行う場合:ob1 = [SearchViewControllerPro alloc] init]; ob2 = [SearchViewControllerPro alloc] init]; (これはあなたがやったことです)どうすれば1つのインスタンスに解決できますか? 2つのオブジェクトは2つのオブジェクトです。 – hooleyhoop

+2

私は質問を言い換えることができます:私はペンで "UIViewController"をビューとしてロードする方法を知っています。 iOS7では、topLayoutGuideを基準にして要素の位置を変更する必要があるため、ペンをペン先の最上位要素として配置しなければならず、これまでのロードは失敗しました。あなたは症状を正しく記述しています - ペンの構造とView Controllerをインスタンス化しようとする方法のために、私は2つのオブジェクトを取得します。しかし、私はペン先とローディングコールを設定して1つしか終わらないことを知りません。私はそれがより良く説明できることを願っています – Chris

3

次は同様に動作し、(少なくとも私には)のViewControllerのための出口を作成することをもう少し明示的です:あなたの編集について

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents objectAtIndex:0]; 
0
if (isIPad) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPad" owner:self 
options:nil]; 

} 
else{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPhone" owner:self options:nil]; 

} 
+0

このコードは問題を解決するのに役立つかもしれませんが、_why_および/または_how_が解答しません質問。この追加の文脈を提供することは、長期的な教育的価値を大幅に改善するだろう。どのような制限や仮定が適用されるかなど、あなたの答えを解説してください。 –

関連する問題