Сначала переместите имя NIB в класс ViewController с помощью кода, такого как:
- (MoreViewController *)init
{
self = [super initWithNibName:@"MoreView" bundle:nil];
if (self != nil)
{
}
return self;
}
Это сделает ваши контроллеры представления автономными, чтобы вы могли создавать их аккуратно:
MoreViewController *moreViewController = [[MoreViewController alloc] init];
Я рекомендую этот подход, что бы вы ни делали. Пример кода Apple не выдерживает, глупо ставить имя NIB в вызывающей стороне. Почему каждый вызывающий в контроллере представления должен знать эту внутреннюю деталь реализации?
Далее, помните, что ObjC - это динамический язык. Вы можете создавать объекты на основе их Class name следующим образом:
Class vcClass = NSClassFromString([self.classNameForSender objectForKey:sender])
UIViewController *vc = [[[vcClass alloc] init] autorelease];
[self switchToView:vc];
В приведенном выше примере -classNameForSender
- это NSDictionary
, который отображает объекты кнопки на имя класса, но вы, конечно, можете получить эти имена классов многими другими способами. В зависимости от отправителя, вы можете повесить класс непосредственно на отправителя (хотя это трудно сделать со стандартными UIControl
s, потому что у них есть только целое число tag
для работы).
Я не продублировал твое хранение ВК в иваре. Тебе это действительно нужно? Если это так, вы можете сохранить его в словаре по имени или вы можете сохранить все VC в NSMutableSet
. Но в большинстве случаев вам это действительно не нужно, поскольку большинство контроллеров пользовательского интерфейса (например, NavController) будут управлять памятью за вас.
Еще один менее динамичный подход - создать все элементы управления представлением вначале и поместить их в словарь, затем вы можете просто загрузить их из словаря в зависимости от отправителя. Это имеет преимущество в улучшении проверок во время компиляции, но может потреблять гораздо больше памяти.