У меня есть класс FooView
, который является подклассом UIView
, и представление которого загружается из nib, что-то вроде:
+ (instancetype)viewFromNib
{
NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"FooView" owner:self options:nil];
return [xib objectAtIndex:0];
}
У самого ниба есть свой пользовательский класс, установленный в FooView
в Identity Inspector.
Это создается как:
FooView *view = [FooView viewFromNib];
Это ведет себя так, как вы ожидали. Однако, когда FooView сам подклассифицирован как FooSubclassView и создается как:
FooSubclassView *view = [FooSubclassView viewFromNib];
view
по-прежнему имеет тип FooView
, а не FooSubclassView
.
Swizzling класс с object_setClass
не фиксирует тот факт, что базовый объект является экземпляром FooView
, и, таким образом, методы, вызываемые в экземпляре подкласса, будут соответствовать классу суперкласса (FooView
), а не FooSubclassView
.
Как я могу исправить это, чтобы подклассы имели правильный тип, без необходимости создавать новый nib для каждого подкласса или для переопределения viewFromNib
в каждом подклассе?