Создание многоразового UIView с xib (и загрузка из раскадровки)

Хорошо, в StackOverflow есть десятки сообщений об этом, но ни одно из них не совсем ясно в отношении решения. Я хотел бы создать кастомUIView с сопроводительным XIB-файлом. Требования следующие:

Нет отдельногоUIViewController - полностью автономный классРозетки в классе, которые позволяют мне устанавливать / получать свойства вида

Мой текущий подход к этому:

Override-(id)initWithFrame:

-(id)initWithFrame:(CGRect)frame {
    self = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class])
                                          owner:self
                                        options:nil] objectAtIndex:0];
    self.frame = frame;
    return self;
}

Создавать программно используя-(id)initWithFrame: на мой взгляд контроллер

MyCustomView *myCustomView = [[MyCustomView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view insertSubview:myCustomView atIndex:0];

Это работает нормально (хотя никогда не звонит[super init] и простая установка объекта с использованием содержимого загруженного пера кажется немного подозрительной - здесь есть советдобавить подпредставление в этом случае что тоже отлично работает). Тем не менее, я хотел бы иметь возможность создавать представление и из раскадровки. Так что я могу:

ПоместитеUIView на родительском представлении в раскадровкеУстановите его пользовательский класс вMyCustomView

Override-(id)initWithCoder: - код, который я видел чаще всего, соответствует такой схеме:

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self initializeSubviews];
    }
    return self;
}

-(id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self initializeSubviews];
    }
    return self;
}

-(void)initializeSubviews {
    typeof(view) view = [[[NSBundle mainBundle]
                         loadNibNamed:NSStringFromClass([self class])
                                owner:self
                              options:nil] objectAtIndex:0];
    [self addSubview:view];
}

Конечно, это не работает, независимо от того, использую ли я описанный выше подход или создаю экземпляр программно, оба заканчивают тем, что рекурсивно вызывают-(id)initWithCoder: при входе-(void)initializeSubviews и загрузка пера из файла.

Несколько других вопросов SO имеют дело с этим, таких какВот, Вот, Вот а такжеВот, Однако ни один из приведенных ответов удовлетворительно не решает проблему:

Распространенным предложением является встраивание всего класса в UIViewController и выполнение загрузки пера туда, но это кажется мне неоптимальным, так как требует добавления другого файла в качестве оболочки

Может ли кто-нибудь дать совет, как решить эту проблему, и получить рабочие места в обычайUIView с минимальной суетой / без тонкой оболочки контроллера? Или есть альтернативный, более чистый способ сделать что-то с минимальным стандартным кодом?

Ответы на вопрос(6)

Ваш ответ на вопрос