ios - UINavigationController 子类未在预期时调用 willShowViewController

标签 ios ios5 uinavigationitem uinavigationcontroller

我使用 ECSlidingViewController 实现了一个带有样式菜单中幻灯片的应用程序

目前我有以下设置: ECSlidingViewController 的初始 View Controller 子类。这处理顶 View Controller (屏幕上显示的主视图)和左下 Controller (即菜单)的推送。

菜单是 TableView Controller 的子类,当单击一行时,新的顶 View Controller 将被插入堆栈。

根据previous question我使用一个导航 Controller (子类),它包含一个 Root View Controller 。每次选择一行时,导航 Controller 的新实例都会加载不同的 View Controller ,旧的已释放。例如:

// 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];
                        }];
                    }];
                }

目前一切正常。我遇到的问题是登录顺序。如果用户注销,则会以模态方式推送不同的导航堆栈。用户成功登录后,就会发出通知。这是由初始 View Controller 接收的(从上面):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didLoginUser) name:@"LoginCompleteNotification" object:nil];

然后,该方法将用户推送到相关子类导航 Controller 的新实例,并将主 Controller 作为根。

// 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;

当创建导航 Controller 的这个新实例时,委托(delegate)方法 willShowViewController 似乎没有被调用?我不明白为什么,当通过菜单 TableView 更改 Controller 时它会调用它,并且它使用相同的方法来创建,有什么想法吗?

最佳答案

苹果文档指出

The UINavigationControllerDelegate protocol defines methods a navigation controller delegate can implement to change the behavior when view controllers are pushed and popped from the stack of a navigation controller.

因此,我认为仅当您向导航堆栈推送或弹出 View Controller 时才会调用 willShowViewController 方法。

关于ios - UINavigationController 子类未在预期时调用 willShowViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16529039/

相关文章:

ios - 在 IOS 中隐藏 UINavigationItem

ios - 在 swizzled 方法中识别方法名称

iphone - 切换到 map 应用后返回同一个应用

ios - 为什么保存Twitter ACAccount时出现此错误?

ios - 按钮的导航栏项目拉伸(stretch)图像

ios - 具有多种颜色的大型导航栏文本

ios - 如何显示带有事件指示器的警报 View ?

ios - swift:将字符串转换为 double 时出现问题

ios - 无法在iOS 6上启动debug IPA,在iOS 5上完美运行

ios - Xcode 中的 iPhone 模拟器是否支持低功耗蓝牙?