Подтвердить что ты не робот

Загрузите Nib для UIView, который используется в ViewController в StoryBoard

У меня есть UIView, который я хочу использовать в нескольких контроллерах View, поэтому я создал представление (.h/.m) и файл nib для него. В представлении Storyboard добавлено как subview для просмотра контроллера, но не загружает макет, как определено в nib.

Можно ли загрузить nib для UIView, используемого в контроллере представления в раскадровке?

4b9b3361

Ответ 1

Если вы спросите о просмотре вашего содержимого .xib в Interface Builder при редактировании Storyboard, не возможно. Но если вам нужно загрузить его во время выполнения, возможно.

  • .h/.m должен содержать подкласс UIView
  • в файле .xib вам нужно установить Владелец файла (Identity Inspector → Custom Class) с вашим пользовательским подклассом UIView
  • в файле .h добавьте @property (strong, nonatomic) IBOutlet UIView* view; и подключите контейнер View от Interface Builder к этому полю (Ctrl + Click на View и перетащите соединение с выше view в .h
  • подключить другие подзаголовки к .h
  • в файле .m, который нужно разместить


- (void)awakeFromNib {
    NSString* nibName = @"Place here your Nib name without extension";
    if ([[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]) {
        [self.view setFrame:[self bounds]];
        [self addSubview:self.view];
    }
}

Это все. Переместите Вид в сцену раскадровки, измените Пользовательский класс на свой FooView, импортируйте .h в код View Controller и используйте IBOutlets, как вы хотите.

Счастливое кодирование

ИЗМЕНИТЬ

Я хочу заметить, что в awakeFromNib documentation мы должны избегать такого кода в awakeFromNib.

Рекомендуется поддерживать индивидуальное соответствие между вашими файлами Owner Owner и связанными с ними файлами nib. Загрузка двух файлов nib одним и тем же объектом "Владелец файла" приводит к тому, что вызов метода awakeFromNib вызывает дважды, что может привести к повторной инициализации некоторых структур данных нежелательными способами. Также рекомендуется избегать загрузки других файлов nib из вашей реализации метода awakeFromNib.

Ответ 2

Назовите свой вид ViewInNib, затем мы имеем:

  • ViewInNib.h
  • ViewInNib.m
  • ViewInNib.xib

В своем раскадровке поместите компонент placeholder UIView в контроллер представления, не забудьте установить его класс ViewInNib, а затем в ViewInNib.m:

static BOOL isReplaced = NO;
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
    if (!isReplaced) 
    {
        isReplaced = YES;
        ViewInNib *replaced = [[[NSBundle mainBundle] loadNibNamed:@"ViewInNib" owner:nil options:nil] lastObject];
        replaced.frame = self.frame;
        replaced.translatesAutoresizingMaskIntoConstraints = NO;
        return replaced;
    }
    isReplaced = NO;
    return self;
}

В этом методе мы заменяем реальный вид, загруженный из nib, из представления в раскадровке. Надеюсь, что это поможет.

Ответ 3

использовать XXNibBridge:

https://github.com/sunnyxx/XXNibBridge

Супер прост в использовании и работает с Swift. Полный кредит принадлежит @sunnyxx