a) должен ли NIB автоматически каким-либо образом загружаться, если имя названо в виде файла * .h & * .m?(т.е. я говорю о пользовательском UIView здесь, а не UIControllerView)
Насколько я знаю, перья не загружаются автоматически, за исключением MainWindow, который загружается UIKit в зависимости от того, что онуказанный в info.plist;
b) если вам нужно сделать это вручную, вам нужно использовать "[[NSBundle mainBundle] loadNibNamed: @" NIBfilename "owner: self options: nil];"возможно?
loadNibNamed
- хороший вариант, если вы не хотите создавать экземпляр контроллера представления и вам нужен только массив верхнего объекта, который вы определили в своем кончике;
c) если да (см. B выше), то в каком методе вы это делаете, в методе пользовательского представления "- (id) initWithCoder: (NSCoder *) coder"?
Я бы использовал initWithCoder
, если вы загружаете базовый вид из пера, initWithFrame
, если вы создаете его программно.
РЕДАКТИРОВАТЬ:
Что касается вашего PSЯ предполагаю, что вы установили один из объектов в вашем xib-файле как экземпляр подкласса UIView
, в котором вы определяете initWithCoder
.(например, если ваш подкласс UIView
равен MyView
, то вы также создали экземпляр объекта представления в xib и установили его класс на MyView
).
Если это так, то что вам нужноdo определяет владельца файла для конкретного производного класса UIView
(например, MyView
);действительно, вы уже создаете экземпляр производного класса UIView
, и при загрузке пера вам нужно только указать владельца файла (через аргумент owner
).
РЕДАКТИРОВАТЬ 2:
о, на самом деле явижу, что на самом деле у меня есть (а) в родительском UIControllerView, который использует мой пользовательский вид, в IB для его XIB я использую UIView, который я установил имя класса в «clockview», но затем (b) в моем собственном обычном часовом просмотреXIB-файл UIView (не UIControllerView) Я сделал то же самое и установил имя класса «clockview».Вы знаете, какое имя класса я должен использовать для (а) родительского UIControllerView и (б) самого пользовательского UIView здесь?(немного запутался) - Грег 1 час назад
После прочтения вашего комментария у вас есть два способа сделать это .:
Первый вариант
в xib, связанном с UIViewController
, вы делаете все правильно;
в другом файле xib удалите пользовательский UIView
(тот, который вы присвоили имени класса clockview
;этот объект уже будет создан с помощью xib точки 1, поэтому вам не нужно его создавать снова);выберите владельца файла этого «другого xib» и задайте для его имени класса clockwork
.
В этом случае вы определите initWithCoder
, как вы делали ранее.Недостатком этого является то, что вы создаете экземпляры объектов в одном перо, а представление - в другом;Вы не сможете определить вид на часы во втором кончике.Итак, ...
Второй вариант
в вашем UIViewController
связанном xib, измените имя класса UIView
и установите его на UIView
;таким образом, это представление будет "нормальным" представлением, которое вы будете использовать в качестве пустого представления для размещения другого представления из второго файла XIB;
в другом файле Xib, оставьте все какони есть;возможно, вы могли бы установить для владельца файла в этом случае значение UIViewController
пункта 1.
Я думаю, что этот второй случай является тем, к которому вы стремитесь.В этом случае вам не нужно делать ничего конкретного в вашем часовом обзоре initWithCoder
;что вам нужно, в вашем UIViewController
, при необходимости, загрузить представление xib;обычно это может быть в viewDidLoad
(или в другом месте, возможно, после нажатия кнопки, это зависит от вашего приложения):
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"ClockView" owner:self options:nil];
for (NSObject *obj in nibs) {
if ( [obj isKindOfClass:[clockview class]]) {
[self addSubview:(clockview*)obj];
break;
}
}
}
То, что я делаю в этом viewDidLoad
, идентифицирует часовой механизмэто создается путем загрузки второго файла XIB;и добавив его в представление контроллера как подпредставление.
Опять же, обратите внимание на аргумент controller
, который я передал loadNibNamed
;это должно соответствовать объекту, который вы указали как владелец файла второй xib.
Я думаю, что он должен работать таким образом.