【问题标题】:Unable to pushViewController for subview无法为子视图 pushViewController
【发布时间】:2010-12-13 22:13:45
【问题描述】:

我有一个 UINavigationController,我有单独的 UIView,我在使用 UISegmentControl 之间切换。在切换视图时,我将视图作为子视图添加到导航控制器的视图中:

[self.view addSubview:segmentTab1.view];

[self.view addSubview:segmentTab2.view];

然后,在 subViews 中,每个都有一个 UITableView,但我的问题是,我无法在 didSelectRowAtIndexPath 方法中将新的 viewController 推送到视图中。

该方法被正确调用并通过设置断点,我可以看到推送视图的方法也被调用,但没有任何反应。这是我推送它的代码:

[self.navigationController pushViewController:detailsViewController animated:YES];

我也试过了

[super.navigationController pushViewController:detailsViewController animated:YES];

我做错了什么 - 或者只是无法使用子视图来做到这一点?

【问题讨论】:

    标签: iphone uitableview uinavigationcontroller didselectrowatindexpath


    【解决方案1】:

    在为所有视图实现公共标头时,我遇到了类似的问题 经过多次尝试,我已经修复了它 -

    在所有的viewController中

    - (void)viewWillAppear:(BOOL)animated {
    
        [self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];
        [[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES];
    
    }
    

    我参考了以下帖子来实现标题视图 Common XIB in multiple View Controller in iPhone

    [self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];     // line will load the header subview 
    

    [[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES]; // 这是调用 HeaderController 的 viewWillAppear 方法,我们可以在其中编写代码来检查用户是否已登录,并将登录按钮更改为注销按钮等..

    【讨论】:

      【解决方案2】:
      LogEntryDetailViewController *leController = [[LogEntryDetailViewController alloc] initWithNibName:@"LogEntryDetailView" bundle:[NSBundle mainBundle]];
          [leController setTitle:[NSString stringWithFormat:@"%@", [logEntriesArray objectAtIndex:row]]];
          [[self navigationController] pushViewController:leController animated:NO];      
          [leController release], leController = nil;
      

      【讨论】:

        【解决方案3】:

        如果您不反对单例,一种可能性是使您的产品的 UINavigationController 对象成为单例,可以从(例如)您的应用程序委托访问。

        你会这样调用它:

        [[((MyApplicationDelegate*)[UIApplication delegate]) navController] 
                        pushViewController: viewControllerToPush animated: YES];
        

        在 MyApplicationDelegate 中,navController 返回单例对象。

        【讨论】:

          【解决方案4】:

          代替

          [self.view addSubview:segmentTab1.view];
          

          [self.view addSubview:segmentTab2.view];
          

          你可以使用

          [self pushViewController: segmentTab1 animated: NO];
          

          [self pushViewController: segmentTab2 animated: NO];
          

          将您的 viewControllers 添加到导航层次结构中,并使 [super.navigationController pushViewController:detailsViewController animated:YES]; 工作。

          【讨论】:

          • 不确定这是否可行,但如果您在 segmentController 中切换视图,并使用 TabBar,点击该视图的 tabBarItem 将推回视图。看起来不太好:(
          • 我不确定我是否正确理解了这种行为。或许你应该看看 navigationController 的 visibleViewController 属性,如果它对应于你要推送的视图,就不要再推送了。
          【解决方案5】:

          我并不完全清楚您的视图层次结构是什么,但一般来说,如果您的导航控制器视图不是窗口的第一个子视图或 Apple 集合视图之一的元素(另一个导航视图控制器的内容视图或选项卡控制器的内容视图)它将无法正常工作。

          【讨论】:

            【解决方案6】:

            调用-pushViewController时,哪个视图控制器是self?如果您在其中一个选项卡子视图中调用它,则 self 可能没有从您添加到的顶级视图中对导航控制器的引用。您可以通过从顶级视图中获取导航控制器的内存地址并将其与子视图中的内容进行比较来验证这一点。显然,如果它是 nil 或不匹配,那是你的问题。

            只有使用 -pushViewController 将导航控制器添加到导航堆栈本身时,您才能“免费”获得一个导航控制器,而您的子视图尚未以这种方式添加。

            【讨论】:

            • 完全正确——对 pushViewController 的调用必须来自本身已被推送到导航控制器的视图。它不一定是最后一个推送的,但它必须在导航控制器堆栈上。
            • 澄清:“必须来自视图控制器”——不是视图。
            • 谢谢,马特。和'Amagrammer'。我有标签,每个标签都有 NavigationControllers,它们有一个 nib 和一个附加到它们的视图的类。我将对其进行设置,因此每个选项卡都有一个视图控制器,并且在每个视图控制器中,我添加了一个 UINavigationController,它根据 segmentedControl 切换它的视图,希望当我到达那里时我可以推入子视图: )
            • 基本上。 iPhone 上的 App Store 应用程序就是我想要实现的一个示例。 TabBar,每个都有一个 UINavigationController 有 segmentedController(其中一些至少有)并且可以推送行。
            • 我同意,当您向现有视图添加子视图时,它不会包含对导航控制器的引用,并且您的 pushViewController:animated: 调用将被发送到 nil 并被忽略。有趣的是,App Store 应用程序(和其他几个应用程序)看起来像是使用分段控件来过滤单个 nib 中的表数据,而不是作为不同 nib 之间的选择(本质上是选项卡视图)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-11
            • 1970-01-01
            • 2016-08-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多