2012-03-03 2 views
1

Я боролся с этим некоторое время, и я думаю, что решение действительно простое, но я просто не могу понять это правильно. У меня есть UIViewController, у которого есть свое представление, и теперь я хотел бы добавить к нему подобие. Subview следует загружать из наконечника. Я следовал шаги, описанные here, т.е. .:
1. Создать MyView класс, который является подклассом UIView
2. Объявите свойства IBOutlet в MyView
3. Сделать .xib файл, в котором владелец файла устанавливается в UIViewController и просмотр класса установлен MyView
4. Подключите выходы
5. в MyViewController, viewDidLoad метод:load view from the nib

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; 
MyView *mView; 
for (id view in nibViews) { 
    if ([view isKindOfClass:[MyView class]]) { 
     mView = (MyView*) view; 
    } 
} 
[self.view addSubview:mView]; 

MView загружен успешно, но когда я пытаюсь добавить его как subview я получаю EXC_BAD_ACCESS. Я даже добавил: mView = [(MyView*) view retain];, но это не помогает.

Что я делаю неправильно?

ответ

1

я не уверен в вашей точки 3:

Make .xib файл, в котором владелец файла устанавливается в UIViewController и просмотр класса установлен в MyView

в владелец файла не должен быть uiviewcontroller, но класс MyView

+0

Вы были правы в этом - я выполнял шаги в ответе SO, на который ссылается. Не могу поверить, что раньше этого не осознавал. Thanx – Maggie

2

Не переживай ...

Вам не нужно принимать отдельный файл острия и снова ссылается на класс MyView. Просто вы можете перетащить UIView из библиотеки в ваш текущий xC-файл viewController, а затем вы можете просто подключить представление из текущего представления к xib.

Смотрите ниже картинки: enter image description here

+0

Теперь вы можете создавать.h as: IBOutlet UIView * myView; а затем добавьте его, когда захотите. Любые вопросы, дайте мне знать. –

+0

dis является самым простым способом –

1

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

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

  • В И.Б., нажмите на главной UIView, и в идентичности инспектора, установить класс для подкласса
  • В ИБ, выберите Файл владелицей, а в 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 были правильно подключены.