2008-10-26 5 views

ответ

28
  1. В интерфейсе Builder создайте новый xib с шаблоном просмотра.
    • Нажмите на представлении в списке объектов в XIb (вы также должны видеть «файл Владелец и„Первый ответчика“).
    • Нажмите Cmd-4, чтобы открыть панель Удостоверения из инспектор.
    • Введите имя вашего класса, в поле «имя класса» и нажмите возвращения.

Вы должны быть в состоянии д тряпичные кнопки. Чтобы получить код от кода, используйте -[NSBundle loadNibNamed:owner:options:]. Ваше представление должно быть первым объектом в возвращаемом массиве.

+0

Я пытаюсь сделать то же самое - Знаете ли вы, какое имя класса я должен использовать для (a) родительского UIControllerView и (б) пользовательский UIView сам здесь? Я отметил в своем коде, что у меня есть собственное имя класса UIView в обоих, но это дает мне рекурсивный вызов для моего настраиваемого метода init UIView. То есть у меня есть (a) в родительском UIControllerView, который использует мое настраиваемое представление, в IB для его XIB я использую UIView, который я установил для имени класса «clockview», но затем (b) в моем фактическом часовом пользовательском UIView (не UIControllerView) XIB-файл Я сделал то же самое и установил имя класса как «clockview». – Greg 2011-07-13 20:51:16

3

В моем случае я не хотел, чтобы мой контроллер просмотра имел какие-либо знания IBOutlets из .xib моего представления. Я хотел, чтобы мой подкласс представления принадлежал IBOutlets. К сожалению, UIView не имеет метода initWithNibName:, поэтому я просто создал свою собственную категорию.

Вот что я сделал:

  • В IB, нажмите на главном UIView, и в идентичности инспекторе, установите класс в подкласс
  • В IB, выберите в меню Файл владелицы, а в Identity Inspector, установите класс в свой подкласс
  • Используйте метод вашей новой категории initWithNibName:, чтобы создать экземпляр вашего представления.

А вот категория я создал:

- (instancetype)initWithNibName:(NSString *)nibName 
{ 
    NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]; 
    if (arrayOfViews.count < 1) { 
     return nil; 
    } 

    self = arrayOfViews[0]; 

    return self; 
} 

Вдохновленный this post.

Обратите внимание, что до сих пор кадр будет настраиваться автоматически, поэтому, в отличие от кода в сообщении, мне еще не нужно явно устанавливать кадр. Кроме того, в отличие от кода сообщения, мне нужно было установить owner:self, чтобы IBOutlets были правильно подключены.

Смежные вопросы