UINavigationController pushViewController 不起作用

Posted

技术标签:

【中文标题】UINavigationController pushViewController 不起作用【英文标题】:UINavigationController pushViewController does not work 【发布时间】:2014-04-05 16:38:59 【问题描述】:

我已经查看了所有其他类似的问题,但找不到解决方案。

我的 iPad 故事板有一个选项卡栏控制器作为“初始视图控制器”,它通过“关系序列视图控制器”链接到导航控制器,导航控制器通过“根视图”链接链接到视图控制器 A,后者有一个 UIButton,它通过“手动序列推送”链接到视图控制器 B。

Tab Bar Cntrl => Navigation Cntrlr ==(root view)==> View Cntrl A, UIButton ==(push)==> View Cntrl B

因此,在运行时,显示视图控制器 A,按下其 UIButton 需要更改为视图控制器 B。但是没有任何反应......

响应 UIBUTTON(按住手势)的代表............

 - (void)schedule_long_press_delegate:(UILongPressGestureRecognizer *)recognizer  if (recognizer.state == UIGestureRecognizerStateEnded)  printf("Long press Ended ................. \n");
    // Get storyboard:
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad"
                                                             bundle: nil];
    printf("mainStoryboard = %x \n", (int)mainStoryboard ); // !!! ax

    // Get nav controller for MANAGE view:
    UINavigationController *MANAGE_UINavigationController = (UINavigationController*)[mainStoryboard 
                        instantiateViewControllerWithIdentifier: @"MANAGE_Storyboard_ID"];
    printf("MANAGE_UINavigationController = %x  \n", (int)MANAGE_UINavigationController ); // !!! ax


    // Get MANAGE view's view controller:
    SCHEDULE_UIViewController *schedule_UIViewController = [self.storyboard instantiateViewControllerWithIdentifier:
                                        NSStringFromClass([SCHEDULE_UIViewController class])];
    printf("schedule_UIViewController = %x  \n", (int)schedule_UIViewController ); // !!! ax

    // Change screen to MANAGE view:
    [MANAGE_UINavigationController  pushViewController: schedule_UIViewController animated:YES];

else 
    printf("Long press detected .....................   \n");
        

故事板设置:

UITabBarController ... Storyboard ID is blank. ..links to: UINavigationController ... Class=UINavigationController StoryboardID = "MANAGE_Storyboard_ID" ..links to: UIViewController ... Class=acc StoryboardID is blank (INITIAL VIEW) ..links to: UIViewController ... Class & StoryboardID = "SCHEDULE_UIViewController" (TARGET VIEW)

输出:........

当委托触发时,它会显示所有已设置的指针:

mainStoryboard = 1f8b4900
 MANAGE_UINavigationController = 1e5d45f0
 schedule_UIViewController 2 = 1e5d4b20 

我缺少一些初始化吗?

【问题讨论】:

请重新格式化..无法得到代码是什么.. 【参考方案1】:

“实例化”一词告诉您正在创建一个实例。因此,当您调用时:

UINavigationController *MANAGE_UINavigationController = (UINavigationController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"MANAGE_Storyboard_ID"];

您正在创建一个新的导航控制器,它不是当前可见层次结构的一部分。

虽然您的对象和调用可能没问题,但您并没有与管理屏幕的控制器进行交互。

(注意:如果您使用符合 Apple 标准的代码样式,其他人会更容易分析您编写的内容。)

【讨论】:

那么应该如何将 MANAGE_UINavigationController 设置为实际的故事板 UINavigationController,它的故事板 ID 为“MANAGE_Storyboard_ID”? 假设包含此代码的视图控制器活动控制器并由导航控制器管理,您可以要求它自己的[self navigationController];navigationController 的 Apple 文档:“视图控制器层次结构中最近的祖先是导航控制器。”

以上是关于UINavigationController pushViewController 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr

从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)

UINavigationController