Замена указателей isa является проблемой, если ваши подклассы имеют переменные экземпляра, отличные от объявленных в SomeClassView
.Обратите внимание, что у вашего файла пера есть объект типа SomeClassView
, что означает, что при загрузке файла пера загрузчик пера выделит объект этого типа и демонтирует его из файла пера.Изменение указателя isa на [SubViewClass class]
временно не сделает его объектом типа SubViewClass
как такового, поскольку то, что выделяет загрузчик пера, является SomeClassView
объектом.
Тем не менее, я не думаю, чтоесть надежный и автоматический способ использования файлов пера, содержащих объекты, типы которых необходимо изменить при загрузке пера.
Что вы можете сделать, это сделать так, чтобы ваши SomeClassView
объекты объявляли делегата, соответствующего некоторому протоколу.Этот протокол определит методы поведения в SomeClassView
, которые потенциально могут быть расширены.Например,
@protocol SomeClassViewDelegate
@optional
- (void)someClassViewDidAwakeFromNib:(SomeClassView *)someClassView;
@end
Вместо подкласса SomeClassView
у вас будут произвольные объекты, выполняющие любое пользовательское поведение, которое вы в настоящее время используете в SubClassView
.Например, объект
@interface SubClassViewBehaviour : NSObject <SomeClassViewDelegate>
…
@end
@implementation SubClassViewBehaviour
- (void)someClassViewDidAwakeFromNib:(SomeClassView *)someClassView {
// whatever behaviour is currently in -[SubClassView foo]
}
@end
A SubClassViewBehaviour
будет создан в коде и назначен владельцем файла пера после загрузки файла пера или любого другого прокси-объекта IB в этом отношении.SomeClassView
будет иметь выход делегата, связанный с объектом владельца / прокси, и будет вызывать методы делегата в соответствующих местах.Например,
@implementation SomeClassView
- (void)awakeFromNib {
SEL didAwakeFromNib = @selector(someClassViewDidAwakeFromNib:);
if ([[self delegate] respondsToSelector:didAwakeFromNib]) {
[[self delegate] performSelector:didAwakeFromNib withObject:self];
}
}
@end
Еще одно замечание: ваш код в настоящее время пропускает объект представления, поскольку создаются два объекта: один через +alloc
в вашем коде, а другой через загрузку пера.Вы назначаете последний на self
, следовательно, тот, который создан с помощью +alloc
, протекает.Кроме того, я полагаю, что в третьем фрагменте кода вы пропустили вызов super
.