0

ECSlidingViewControllerを使用して、スタイル付きメニューにスライドを含むアプリケーションを実装しました

現在、次のセットアップがあります。ECSlidingViewController の初期ビュー コントローラー サブクラス。これは、トップ ビュー コントローラー (画面に表示されるメイン ビュー) とメニューである underLeftController のプッシュを処理します。

メニューは、行がクリックされたときのテーブルビュー コントローラーのサブクラスであり、新しいトップ ビュー コントローラーがスタックにプッシュされます。

前の質問によると、単一のルート ビュー コントローラーを保持するナビゲーション コントローラー (サブクラス化) を使用します。行が選択されるたびに、ナビゲーション コントローラーの新しいインスタンスが別のビュー コントローラーと共に読み込まれ、古い割り当てが解除されます。例えば:

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

現時点では、これはすべて正常に機能しています。私が抱えている問題は、ログインシーケンスにあります。ユーザーがログアウトすると、別のナビゲーション スタックがモーダルにプッシュされます。ユーザーがログインに成功すると、通知が行われます。これは、(上から) Initial View Controller によって受信されます。

[[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したがって、 View Controllerをナビゲーションスタックにプッシュまたはポップする場合にのみ、メソッドが呼び出されると思います。

于 2013-05-15T08:26:18.363 に答える