目前我有以下设置: ECSlidingViewController的初始View Controller子类。这将处理顶视图控制器(屏幕上显示的主视图)和underLeftController(菜单)的推送。
当单击一行时,菜单是一个tableview控制器子类,新的顶视图控制器被压入堆栈。
每previous question我使用一个导航控制器(子类),它包含一个根视图控制器。每次选择一行时,导航控制器的新实例都会加载一个不同的视图控制器,旧的dealloc'd。例如:
// Check if the settings view is currently displayed if it is just reset the top view else load it to the topviewcontroller.
UINavigationController *navController = (UINavigationController *)self.slidingViewController.topViewController;
UIViewController *VC = navController.topViewController;
if ([VC isKindOfClass:[MESSettingsViewController class]]) {
[self.slidingViewController resetTopView];
} else {
MESMainNavViewController *mainNavController = [[MESMainNavViewController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"SettingsVC"]];
__weak typeof(self) weakSelf = self;
[self.slidingViewController anchorTopViewOffScreenTo:ECRight animations:nil onComplete:^{
CGRect frame = self.slidingViewController.topViewController.view.frame;
self.slidingViewController.topViewController = mainNavController;
self.slidingViewController.topViewController.view.frame = frame;
[weakSelf.slidingViewController resetTopViewWithAnimations:nil onComplete:^{
[weakSelf updateCurrentCell];
}];
}];
}
此刻一切正常。我遇到的问题是登录序列。如果用户注销,则以模态方式推送不同的导航堆栈。用户完成登录后,会发出通知。这是由初始视图控制器(从上面)接收的:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didLoginUser) name:@"LoginCompleteNotification" object:nil];
该方法然后处理将用户推送到有问题的子类导航控制器的新实例,以家庭控制器为根。
// If the view controller is not home send them to home
UINavigationController *navController = (UINavigationController *)self.topViewController;
UIViewController *VC = navController.topViewController;
if (![VC isKindOfClass:[MESHomeViewController class]]) {
UIStoryboard *storyboard;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
}
MESMainNavViewController *mainNavController = [[MESMainNavViewController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"HomeVC"]];
self.topViewController = mainNavController;
[self resetTopView];
}
问题似乎与以下部分有关:
MESMainNavViewController *mainNavController = [[MESMainNavViewController alloc] initWithRootViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"HomeVC"]];
self.topViewController = mainNavController;
创建导航控制器的这个新实例时,似乎没有调用委托方法willShowViewController
?我无法找出原因,它通过菜单表视图更改控制器时调用它,它使用相同的方法创建,任何想法?
答案 0 :(得分:1)
苹果医生声明
UINavigationControllerDelegate协议定义方法a 导航控制器委托可以实现改变行为 当视图控制器从a的堆栈中被推出和弹出时 导航控制器。
因此,我认为仅当您将视图控制器推入或导出导航堆栈时,才会调用方法willShowViewController
。