Наша текущая передовая практика для настраиваемых представлений:
- Создайте индивидуальный вид в Nib.
- В контроллере представления программно загрузите перо, получите настраиваемое представление из массива загруженных объектов (мы делаем это в методе категории UIView
+loadInstanceFromNib
). - Добавьте собственное представление в качестве подпредставления, установите его рамку.
Что мы на самом деле хотим, так это «встроить» перо настраиваемого представления в наконечник контроллера представления. В противном случае мы, по крайней мере, хотели бы добавить и расположить настраиваемое перо. -view внутри контроллера представления Nib (не видя его содержимого).
Мы очень близко подошли к следующему решению:
@implementation CustomView
static BOOL loadNormally;
- (id) initWithCoder:(NSCoder*)aDecoder {
id returnValue = nil;
if (loadNormally) { // Step 2
returnValue = [super initWithCoder:aDecoder];
loadNormally = !loadNormally;
} else { // Step 1
loadNormally = !loadNormally;
returnValue = [CustomView loadInstanceFromNib];
}
return returnValue;
}
- (id) initWithFrame:(CGRect)frame {
loadNormally = YES;
self = (id) [[CustomView loadInstanceFromNib] retain];
self.frame = frame;
return self;
}
// ...
@end
Если мы создаем экземпляр пользовательского представления программно, мы используем -initWithFrame:
, который загрузит представление из пера (который вызовет -initWithCoder:
и перейдет прямо к ветви if с меткой «Шаг 2»), установит его фрейм и установит его счетчик сохранения на 1.
Однако, если мы создаем экземпляр пользовательского представления внутри наконечника контроллера представления, статическая переменная loadNormally
(по общему признанию довольно уродливая) изначально будет NO
: мы начинаем с «Шага 1», где мы загружаем и возвращаем экземпляр, загруженный из его наконечника, предварительно убедившись, что что мы немедленно будем использовать "нормальную" if-ветвь -initWithCoder:
. Загрузка из Nib с настраиваемым представлением означает, что мы возвращаемся в -initWithCoder:
, на этот раз с loadNormally==YES
, т.е. мы позволяем механизму загрузки Nib выполнять свою работу и возвращать экземпляр с настраиваемым представлением.
Итоги, вкратце:
- Хорошо: ЭТО РАБОТАЕТ !!! У нас есть «подключаемые» пользовательские представления в Интерфейсном Разработчике!
- Плохо: уродливая статическая переменная…: - /
- Уродливое: Произошла утечка экземпляра настраиваемого представления! Мне нужна ваша помощь - я не понимаю почему. Любые идеи?