1

新しいルート コントローラーをナビゲーション スタックにプッシュしようとしていますが、サイド リビール メニューを使用しています。

私のアプリデリゲートには次のものがあります:

    welcomeViewController = [[MyWelcomeViewController  alloc] initWithNibName:@"MyWelcomeViewController" bundle:nil];
navController = [[UINavigationController alloc] initWithRootViewController:welcomeViewController];
navController.navigationBarHidden = YES;

// Then we setup the reveal side view controller with the root view controller as the navigation controller
self.revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:navController];
[self.revealSideViewController setDirectionsToShowBounce:PPRevealSideDirectionNone];
[self.revealSideViewController setPanInteractionsWhenClosed:PPRevealSideInteractionContentView | PPRevealSideInteractionNavigationBar];

// Then we make the window root view controller the reveal side view controller
self.window.rootViewController = self.revealSideViewController;

ウェルカム ビュー コントローラーが表示されたら、ユーザーはログインします。ログインすると、App Delegate から次のプロセスが再び実行されます。

self.navController.navigationBarHidden = NO;
[self.navController setTitle:@"Home"];
[self.navController pushViewController:homeViewController animated:NO];

次に、カスタムセルがセットアップされたテーブルビューであるサイドビューコントローラーのセットアップがあります。

行が選択されたら、新しいルート コントローラーをナビゲーション コントローラーにプッシュする必要があります。選択したセルのテーブルビューで次を使用して、これを試します。

MyAccountViewController *accountViewController = [[MyAccountViewController alloc] init];
[self.navigationController setViewControllers:[NSArray arrayWithObject:accountViewController] animated:NO];

残念ながら、これは何もしません。コードを App Delegate に追加し、テーブル ビュー コントローラーからメソッドを呼び出すと、動作しますが、テーブル ビュー自体の .m ファイルからは動作しません。上記が実行されていることがわかるログを追加しても、何もしません。

上記で何か違うことをする必要があるかどうかはわかりません。たとえば、現在表示されているビューを完全にポップしてから、ナビゲーション コントローラーと PPRevealSideViewController をもう一度作成します。私が想定している場合、現在のすべてのビューをポップして、AppDelegate からではなく、新しいビューをウィンドウにプッシュする方法がわかりません。

アプリ デリゲートでこれを使用したくない理由は、これにアプローチする方法が正しくないためです。メニューからプッシュする新しいルート コントローラーごとに個別のメソッドが必要になるため、アプリ デリゲートは次のようになります。非常に大きい。

ここに画像の説明を入力

4

2 に答える 2

0

UINavigationController.hを確認してください。

@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationController *navigationController; // If this view controller has been pushed onto a navigation controller, return it.

これは、を実行すると、がどのnavControllerにもプッシュされないか、navController参照がにプッシュされるかmyViewController.navigationControllerを取得することを意味します。nilmyViewControllermyViewController

私はあなたtableViewControllerがnavControllerスタックにプッシュされていないことを理解しているので、それはあなたがでnavControllerを取得できないことを意味します tableViewController.navigationController。代わりに、を使用する必要があります。anyViewControllerInTheStack.navigationControllerまたは、navControllerがの場合rootViewControllerkeyWindow

((UINavigationController*)[[UIApplication sharedApplication] keyWindow].rootViewController)
于 2012-11-05T18:15:21.283 に答える
0

次のようなものを AppDelegate.h に追加します。

#define XAppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])

これで、プロジェクト内の任意の .m ファイルから AppDelegate の任意の iVar にアクセスできるようになりました。

 MyAccountViewController *accountViewController = [[MyAccountViewController alloc] init];
 [XAppDelegate.navController pushViewController:accountViewController animated:NO];

正しいインポートを追加していることを確認してください。もう 1 つ: ログインが完了したら、navcontroller からログイン ウィンドウをポップすることをお勧めします。

お役に立てれば。

于 2012-11-05T18:16:03.777 に答える