У меня есть класс 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 в каждом подклассе?