【问题标题】:UINavigation pushing a new root controllerUINavigation 推送新的根控制器
【发布时间】:2012-10-25 13:43:38
【问题描述】:

我正在尝试将新的根控制器推送到导航堆栈,但使用侧面显示菜单。

我的应用委托具有以下内容:

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

然后我有一个侧视图控制器设置,它是一个带有自定义单元设置的表格视图。

When a row is selected I need to push a new root controller onto the navigation controller.我通过在表格视图中为所选单元格使用以下内容来尝试此操作。

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

不幸的是,这并没有做任何事情。如果我将代码添加到 App Delegate,然后从表视图控制器调用该方法,那么它可以工作,但不能从表视图本身的 .m 文件中调用。添加一个日志我可以看到上面的运行,只是没有做任何事情。

我不确定我是否需要对上述内容做任何不同的事情。例如,完全弹出当前显示的视图,然后重新创建导航控制器和 PPRevealSideViewController。如果我应该这样做,我不确定如何弹出所有当前视图,然后将新视图推送到窗口,而不是来自 AppDelegate。

我不想在 App Delegate 中使用这个的原因是因为它是处理这个问题的不正确方法,然后我需要为每个我想从菜单中推送的新根控制器使用单独的方法,所以 App代表会变得非常大。

【问题讨论】:

    标签: ios ios5 automatic-ref-counting uinavigationcontroller


    【解决方案1】:

    检查UINavigationController.h:

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

    这意味着当您执行 myViewController.navigationController 时,如果 myViewController 未推送到任何 navController 或 navController 引用 myViewController 已推送,您将获得 nil

    据我了解,您的 tableViewController 没有被推入 navController 堆栈,这意味着您无法使用 tableViewController.navigationController 获取 navController。相反,您需要使用anyViewControllerInTheStack.navigationController,或者如果导航控制器是您的keyWindowrootViewController,则由

    ((UINavigationController*)[[UIApplication sharedApplication] keyWindow].rootViewController)
    

    【讨论】:

    • 我不使用 UINavigationController.h 导航控制器是在代码中设置的,因此不需要头文件和 imp 文件。如何使用提供的底部代码更新 rootViewController?
    • 确实使用并导入 UINavigationController.h,因为您开始使用的应用程序模板中的某处有 #import <UIKit/UIKit.h>,通常它位于前缀标头 .pch 文件中。跨度>
    • 谢谢,我绝对觉得这是正确的答案,但我无法让它发挥作用。假设我有一个主视图控制器(在 navController 堆栈上),然后 tableViewController 不在堆栈上。我将如何从表格视图控制导航控制器?您回答中的最后一点提到从堆栈上的视图控制器进行控制,因此这种情况来自主视图控制器。您有示例代码如何完成此操作吗?我是否需要在表格视图中再次分配初始化我的主视图控制器然后尝试控制它?谢谢
    • @StuartM self.navigationController 为您返回导航堆栈中具有selfnavController 引用。如果您想管理堆栈中的navControllers 之一,则需要在堆栈中创建对其中一个控制器的引用,或者在某处创建对navController 本身的引用。初学者习惯于在ApplicationDelegate 中创建这样的引用,因为它很容易从任何地方访问([UIApplication sharedApplication].delegate),我建议您使用单独的管理器类(可能是单例)来控制所有导航.
    • 谢谢你有任何示例代码如何在单例中使用它,或任何参考如何?我不确定我是否理解您答案中的最后一行代码以及如何/在何处使用它?感谢您的帮助!
    【解决方案2】:

    在您的 AppDelegate.h 中添加类似这样的内容:

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

    现在您可以从项目中的任何 .m 文件访问 AppDelegate 的任何 iVar。

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

    确保添加正确的导入。 还有一件事:完成登录后,最好从导航控制器中弹出登录窗口。

    希望这会有所帮助。

    【讨论】:

    • 添加定义行我收到错误缺少 [,但我不确定在哪里?
    • 你是在你的导入下添加它吗?我直接从我使用这些东西的代码中复制了它。它对我有用。
    • 你的导入是什么意思?
    • 在 AppDelegate.h 顶部调用 #import #import <UIKit/UIKit.h> #define XAppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])
    • --定义应该在哪里?
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    相关资源
    最近更新 更多