0

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

目前我有以下设置: ECSlidingViewController 的初始视图控制器子类。这处理顶视图控制器(屏幕上显示的主视图)和作为菜单的 underLeftController 的推送。

当单击一行时,菜单是一个 tableview 控制器子类,新的顶视图控制器被推送到堆栈上。

根据上一个问题,我使用了一个导航控制器(子类),它包含一个根视图控制器。每次选择一行时,导航控制器的一个新实例都会加载一个不同的视图控制器,旧的 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似乎没有调用委托方法?我不知道为什么,当通过菜单表视图更改控制器并使用相同的方法创建时,它会调用它,有什么想法吗?

4

1 回答 1

1

苹果文档指出

UINavigationControllerDelegate 协议定义了导航控制器委托可以实现的方法,以更改视图控制器从导航控制器堆栈中推送和弹出时的行为。

因此,我认为willShowViewController只有当您将视图控制器推送到导航堆栈或从导航堆栈弹出视图控制器时才会调用该方法。

于 2013-05-15T08:26:18.363 回答