Я уже ответил на нечто подобное ранее (см. вопрос ) с тем же решением, которое вы используете в настоящее время (см. Пункт 2 моего ответа), но я подумал о чем-то вроде обработки флага не как логическое значение, а чтобы сделать это с помощью enum, поэтому достаточно будет 1 переменную.
typedef enum {
ViewControllerPushControllerNone,
ViewControllerPushControllerSettings,
ViewControllerPushControllerWhatever
} ViewControllerPushController;
@interface ViewController : UIViewController {
ViewControllerPushController _pushController;
}
@property(nonatomic, assign) ViewControllerPushController pushController;
@end
@implementation ViewController
@synthesize pushController = _pushController;
- (void)viewDidAppear:(BOOL)animated {
switch(self.pushController){
case ViewControllerPushControllerSettings:
// Push Settings controller
break;
case ViewControllerPushControllerWhatever:
// Push Whatever controller
break;
}
self.pushController = ViewControllerPushControllerNone;
[super viewDidAppear:animated];
}
@end
Я думаю, что это лучший способ, которым ты можешь получить. Таким образом, вы удерживаете нажатие контроллера в главном навигационном контроллере, и это хорошо, и я думаю, им легко управлять.
РЕДАКТИРОВАТЬ Вы также можете установить свойство как класс, чтобы вам не приходилось связываться с enum typedef. Затем вы могли бы также опустить оператор switch, потому что тогда вы можете сделать что-то вроде:
- (void)viewDidAppear:(BOOL)animted {
if(self.pushController != nil){
NSString *selector = [NSString stringWithFormat:@"push%@", NSStringFromClass(self.pushController)];
[self performSelector:NSSelectorFromString(selector)];
}
self.pushController = nil;
[super viewDidAppear:animated];
}
- (void)pushSettingsViewController {
if(_settingsViewController == nil){
_settingsViewController = [[SettingsViewController alloc] init];
}
[self.navigationController pushViewController:_settingsViewController animated:YES];
}