У меня есть универсальное приложение для iOS, над которым я работаю. По большей части я обрабатывал различия между устройствами, создавая подклассы, поэтому RootViewController разделен на подклассы RootViewController-iPad и RootViewController-iPhone. Шаблон начинается в main.m, где я делаю обнаружение устройства следующим образом:
int retVal;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
retVal = UIApplicationMain(argc, argv, nil, @"SalesPadAppDelegate_iPad");
} else {
retVal = UIApplicationMain(argc, argv, nil, @"SalesPadAppDelegate_iPhone");
}
Этот шаблон работает довольно хорошо и сводит к минимуму повторное использование кода.
Далее по стеку у меня есть серия контроллеров представления, которые наследуются от общего суперкласса, MasterDetailViewController. Этот суперкласс нуждается в некотором коде, специфичном для устройства, поэтому я подумал о том, чтобы создать подкласс этого класса, а затем получить суперкласс, автоматически выделяющий или создающий экземпляр специфичного для устройства подкласса, который наиболее подходит.
Реализация мудрая, это выглядит следующим образом:
+(id)allocWithZone:(NSZone *)zone {
if ([[self class] isEqual:[MasterDetailViewController_iPad class]] || [[self class] isEqual:[MasterDetailViewController_iPhone class]]) {
return [super allocWithZone:zone];
} else {
if ([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPhone) {
return [MasterDetailViewController_iPhone allocWithZone:zone];
} else {
return [MasterDetailViewController_iPad allocWithZone:zone];
}
}
}
Этот код не работает и является своего рода демонстрацией концепции. Есть ли способ сделать то, что я пытаюсь сделать, или я смотрю на вещи все неправильно?
РЕДАКТИРОВАТЬ : Просто чтобы прояснить, данные одинаковы между супер и подклассами. Единственным отличием будет пара реализаций метода. Идея состоит в том, что создание подклассов чище, чем специфический для устройства код спагетти.