Загрузите перо из других перьев (например, Interface Builder) в Какао

У меня есть настройка представления в Интерфейсном Разработчике, который содержит viewController, который загружает другой файл 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

Таким образом, вам просто нужно подключить выход заполнителя в перо, которое содержит контроллер представления, и он автоматически загрузит другие перья для вас, скопирует все атрибуты из заполнителя и заменит его в главном пере.


person Tony    schedule 26.12.2011    source источник


Ответы (1)


Содержимое пера загружается лениво. Если вы хотите, чтобы был вызван - (void) awakeFromNib, вам нужно сначала получить доступ к чему-то из файла пера.

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

/*
 * awakeFromNib was not called yet
 */

NSView *view = controller.view;

/*
 * but now -(void)awakeFromNib was called.
 */
person Yevgeniy    schedule 27.12.2011
comment
Я понимаю, есть ли способ отобразить загруженное перо, используя только построитель интерфейса? - person Tony; 27.12.2011
comment
не насколько я знаю. Мой подход выглядит так: я создаю перо для главного окна и перо для каждого сложного вида. Контроллер главного окна загружает контроллеры представлений (например, в awakeFromNib) путем вызова - (id) initWithNibName: (NSString *) nibName и отображает представления с window.contentView = viewController.view или [window.contentView addSubView: viewController.view]. - person Yevgeniy; 27.12.2011