【问题标题】:UINavigationController visibleViewControllersUINavigationController visibleViewControllers
【发布时间】:2011-10-03 15:25:01
【问题描述】:

我有一个 UITabBarController,其中一个选项卡是 UINavigationController。我有一个搜索栏,可以转到 UINavigationController 中的某个视图。问题是,如果第一个视图不是由 UINavigationController 推送的,那么它会崩溃,因为我的搜索无法从这个调用中识别 visibleViewController:

UINavigationController *navController = [self.MainTab.viewControllers objectAtIndex:1];
FirstViewController *fVC = [navController visibleViewController];

我不明白的是,在这段代码之前,我是这样做的:

    self.MainTab.selectedIndex = 1;

这段代码会自行选择该选项卡中的 viewController,然后根据我的知识加载视图。那么这对于 [navController visibleViewController] 获取当前的 viewController 还不够吗?谢谢。

【问题讨论】:

  • [navController visibleViewController] 返回什么?什么是崩溃消息?
  • @sergio 我将无法识别的选择器发送到实例以获取崩溃消息?如何检查 visibleViewController 返回的内容,因为如果它崩溃,我的 FirstViewController 没有正确的信息?
  • 看来navController 不是UINavigationController,这就是为什么调用visibleViewController 失败的原因...您确定要从self.MainTab.viewControllers 获取它的索引吗?跨度>
  • @sergio 是的,我检查了索引。如果我省略了我在该块中的搜索代码,而只使用 self.MainTab.selectedIndex = 1,那么我会得到 UINavigationController,viewDidLoad 中的第一个视图被推送到堆栈上。另外,只要我先选择那个选项卡,然后回到主页选项卡,这段代码就会运行,搜索会选择正确的项目。
  • @sergio 我刚试过这个: if ([navController isKindOfClass:[UINavigationController class]]) ,它确实返回 true。

标签: iphone uiviewcontroller uinavigationcontroller uitabbarcontroller


【解决方案1】:

试试 topViewController 而不是 visibleViewController

FirstViewController *fVC = [navController topViewController];

【讨论】:

  • 不幸的是我得到了同样的错误。未识别的选择器发送到实例。
【解决方案2】:

根据您在问题和 cmets 中的解释,我了解到您的代码尝试访问 FirstViewController 类型的对象,据说是第一个视图被推送到您的 UINavigationController,但它尚未创建.

另一方面,如果您首先以编程方式选择选项卡,则会创建视图并且一切正常。实际上,该视图是在选择选项卡时运行的viewDidLoad 方法中创建的。

我建议的解决方案是避免直接从您的搜索标签访问UINavigationController visibleViewController;相反,让您的搜索代码访问您的应用程序的模型(如在 Model-View-Controller 中)并将结果存储在那里;然后,从提到的viewDidLoad 方法再次访问模型以读取搜索结果并更新/显示 UI。

这是 clean 解决方案,IMO。如果您想对当前设计采取某种解决方法,请检查您从 visibleViewController 返回的 fVC 值,如果不是预期的,则正确实例化视图。

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我知道这已得到解答,但我找到了另一个可能有用的解决方案。在我的情况下,我对 NavigationController 中的某些 viewController 进行了不同的旋转处理,我执行了以下操作:

    子类 UINavigationController,然后在您的新子类中需要时,您可以访问当前 visibleViewController 的标题,如下所示:

    - (BOOL)shouldAutorotate
    {
        if ([[self visibleViewController].title isEqualToString:@"Special Case"]) {
            return NO;
        }
        return YES;
    }
    

    这不是特定于旋转的,这正是我使用它的目的。您唯一需要做的就是在viewDidLoad 中为您要检查的每个viewController 设置self.title,如果它们在IB 中设置或未设置,它们将是nil

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 2020-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多