2

別のNibファイルをロードするviewControllerを含むInterfaceBuilderのビュー設定があります。ただし、何らかの理由で、ロードされているnibファイルに含まれているオブジェクトが呼び出されることはありませんawakeFromNib。ここで何が欠けていますか?インターフェイスビルダーでNibからビューをロードし、インターフェイスビルダーでプロパティとサイズを管理する方法はありますか?

ここに画像の説明を入力してください

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

最終的解決:

このような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

このように、View Controllerを含むペン先にプレースホルダーアウトレットをフックするだけで、他のペン先が自動的に読み込まれ、プレースホルダーからすべての属性がコピーされ、メインのペン先に置き換えられます。

4

1 に答える 1

4

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

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

/*
 * awakeFromNib was not called yet
 */

NSView *view = controller.view;

/*
 * but now -(void)awakeFromNib was called.
 */
于 2011-12-27T09:32:52.893 に答える