2011-12-26 12 views
2

別のNibファイルをロードするviewControllerを含むInterface Builderでビュー設定をしています。しかし何らかの理由で、ロードされているnibファイルに含まれるオブジェクトは、決してawakeFromNibと呼ばれることはありません。私はここで何が欠けていますか?とにかくインタフェースビルダーのNibからビューをロードし、そのプロパティとインタフェースビルダのサイズを管理することはありますか?一般的にココアの他のnib(Interface Builder)からペン先をロード

enter image description here

、複数のニブを管理し、複雑なビューにそれらを構成するためのベストプラクティスは何ですか?

最終解決:

私はこのようなNSViewControllerサブクラスを作成しました。

@interface NibLoadingViewController : NSViewController 

// The placeholder would be replaced during run-time by the view 
@property (weak, nonatomic) IBOutlet NSView *placeholder; 

@end 

@implementation NibLoadingViewController 

@synthesize placeholder = _placeholder; 

- (void)awakeFromNib { 
    if (self.placeholder) 
     self.view = self.view; // Trigger lazy loading 
} 

- (void)loadView { 
    [super loadView]; 
    if (!self.view) 
     return; 
    // Replace the placehoder if it exists 
    if (self.placeholder) { 
     // Copy over relevant attributes 
     self.view.frame = self.placeholder.frame; 
     self.view.autoresizingMask = self.placeholder.autoresizingMask; 
     self.view.autoresizesSubviews = self.placeholder.autoresizesSubviews; 
     // Replaces the old view 
     [self.placeholder.superview replaceSubview:self.placeholder with:self.view]; 
     self.placeholder = nil; 
    } 
    self.nextResponder = self.view.nextResponder; 
    self.view.nextResponder = self; 
} 

@end 

この方法では、あなただけのビューコントローラが含まれているペン先のプレースホルダのコンセントをフックする必要があり、それが自動的にあなたのための他のニブをロードして、プレースホルダからすべての属性をコピーし、メインでそれを置き換えますペン先。

答えて

4

nibファイルの内容は遅延ロードされています。 - (void)awakeFromNibを呼びたい場合は、最初にnib-fileから何かにアクセスする必要があります。

NSViewController *controller = [[NSViewController alloc] initWithNibName:@"MyView" bundle:nil]; 

/* 
* awakeFromNib was not called yet 
*/ 

NSView *view = controller.view; 

/* 
* but now -(void)awakeFromNib was called. 
*/ 
+0

私は、とにかくインタフェースビルダーのみを使用してロードされたペン先ディスプレイを作成することはありますか? – Tony

+0

私の知る限りではありません。私のアプローチは次のようになります:私はメインウィンドウのペン先とすべての複雑なビューのペン先を作成します。メインウィンドウのコントローラーは、** - (id)initWithNibName:(NSString *)nibName **を呼び出してビューのコントローラー(たとえばawakeFromNib)をロードし、** window.contentView = viewController.view * *または** [window.contentView addSubView:viewController.view] **。 – Yevgeniy

関連する問題