Бесконечный цикл, пытаясь создать пользовательский вид из XIB в IB
Это продолжение этого вопроса ( пользовательские инструкции UIView с IB / Xcode 4.5.1 и iOS Simulator 6.0), но не обязательно читать - это мой первый раз, когда я пытаюсь создать пользовательский UIView. Я не буду так благодарен за любую помощь, которую вы можете оказать.
У меня есть пользовательский UIView, который получен из Interface Builder. Я хочу установить размер 200w x 200h и backgroundColor на Green. Когда я создал, я сделал следующее:
- Создан новый пользовательский UIView через File -> New -> Objective-C Class под названием Tview
- Создал новый вид через Файл -> Создать -> Пользовательский интерфейс -> Просмотреть и назвал его tnib
- в 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.