Бесконечный цикл, пытаясь создать пользовательский вид из XIB в IB

Это продолжение этого вопроса ( пользовательские инструкции UIView с IB / Xcode 4.5.1 и iOS Simulator 6.0), но не обязательно читать - это мой первый раз, когда я пытаюсь создать пользовательский UIView. Я не буду так благодарен за любую помощь, которую вы можете оказать.

У меня есть пользовательский UIView, который получен из Interface Builder. Я хочу установить размер 200w x 200h и backgroundColor на Green. Когда я создал, я сделал следующее:

  1. Создан новый пользовательский UIView через File -> New -> Objective-C Class под названием Tview
  2. Создал новый вид через Файл -> Создать -> Пользовательский интерфейс -> Просмотреть и назвал его tnib
  3. в Canvas я удалил View и добавил новый View из инспектора объектов и установил имя класса в Tview. Кроме того, в инспекторе Атрибутов я установил размер Freeform и цвет фона - Зеленый. В инспекторе размеров я установил ширину 200, а высоту 200.

В моем Tview.m я настроил следующее (я сделал некоторые обновления, основанные на других вопросах SO, но неясно, являются ли они все еще актуальными или точными):

@implementation Tview

-(id) initWithCoder:(NSCoder *)aDecoder
{
  NSLog(@"in initWithCoder");
  if((self = [super initWithCoder:aDecoder])) {
    [self setUpView];
    }
  return self;
}

-(void)awakeFromNib
{
  NSLog(@"in awakeFromNib");
  [self setUpView];
}

-(void)setUpView
{
    NSLog(@"I am in setUpView");
    NSArray *subviewArray=[[NSBundle mainBundle] loadNibNamed:@"tnib" owner:self options:nil];
    UIView *mainView = [subviewArray objectAtIndex:0];
    [self addSubview:mainView];
}

@end

В моем ViewController.xib я перетаскиваю UIView и устанавливаю имя пользовательского класса в Tview. Я # импортирую файл Tview.h и перетаскиваю его из ViewController.xib в Tview.h и создаю следующее свойство:

@property (strong, nonatomic) IBOutlet Tview *myTview;

Я строю и запускаю и получаю бесконечный цикл следующего:

2013-03-04 06:49:05.452 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.455 Nibtest2[44524:11303] I am in setUpView
2013-03-04 06:49:05.456 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.458 Nibtest2[44524:11303] I am in setUpView
2013-03-04 06:49:05.459 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.460 Nibtest2[44524:11303] I am in setUpView

пока это в конечном счете не падает.

Что я здесь не так делаю?

спасибо заранее

2 ответа

Решение

Ваш код устанавливает бесконечную рекурсию: initWithCoder: звонки setUpView, который создает новую UIView из пачки, таким образом вызывая initWithCoder: косвенно и завершая цикл.

Вы не должны обращаться к NIB в коде, который вызывается, когда читается тот же NIB. Вы должны прочитать NIB в коде содержащего объекта, а не в коде Tview сам объект В противном случае вы получите бесконечный цикл.

Вы должны удалить setUpView вместе с его звонками из awakeFromNib и initWithCoder:, Похоже, что соединение, которое вы установили в конструкторе интерфейсов путем перетаскивания из инспектора объектов, уже приводит к корректной загрузке файла NIB, о чем свидетельствует вызов initWithCoder:, Единственная строка, которая может вам понадобиться, это:

[self addSubview:mainView];

Тем не менее, это не должно быть в Tviewкод: его нужно переместить на родительский контроллер, который имеет myTview свойство, и оно должно быть изменено на

[self.view addSubview:_myTview];

Добавить эту строку в viewDidLoad, Это должно позаботиться о проблеме.

На самом деле я решил эту проблему, загрузив представление в viewDidLoad в моем CustonViewController, где я хотел использовать это представление так:

myAccessoryView = NSBundle.mainBundle().loadNibNamed("MyAccessoryView", owner: self, options: nil)[0] as! MyAccessoryView

Не загружайте вид в loadView() метод! Метод loadView служит для загрузки представления для вашего пользовательского ViewController.

Другие вопросы по тегам