【问题标题】:Have UINavigationController auto-adapt to how it's presented让 UINavigationController 自动适应它的呈现方式
【发布时间】:2011-10-19 02:29:57
【问题描述】:

我正在开发一个可以模态显示或推入导航堆栈的视图控制器。我将它设为UINavigationController 子类,这样我就可以免费获得所有UIToolbar 的东西。我可以使用以下方式呈现它:

[self presentModalViewController:myViewController animated:YES];

问题是,UINavigationController 不允许将另一个 UINavigationController 推入其中(有道理),所以它会崩溃:

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

是否有办法检测myViewController 的呈现方式并自动在UINavigationControllerUIViewController 之间切换,这样我就不需要2 个不同的类了?

换句话说,myViewController 将能够检测到它是如何呈现的,并将其推送到类似以下的内容:

[self.navigationController pushViewController:myViewController.topViewController animated:YES];


注意:这样的事情可能会做,但它离默认的 UIViewController 行为太远了:

[myViewController pushIntoNavigationController:navController]; // only push myViewController.topViewController
[myViewController presentModallyInParentController:parentController]; // push the whole myViewController

【问题讨论】:

  • 只是关于子类化 UINavigationController 以“免费获得所有 UIToolbar 的东西”: UINavigationController 已经包含一个免费的 UIToolbar,默认情况下它是隐藏的。使用 UINavigationController 上的 setToolbarHidden:animated: 方法取消隐藏它。您可以通过 UINavigationController 的 toolbar 属性访问常规 UIToolbar 来完成所需的一切
  • 这就是我的意思,我将它子类化,以便我可以轻松地将按钮添加到已经存在的工具栏,我不需要自己创建一个,将其添加到视图层次结构等.
  • 不过,您不必子类化即可在 UINavigationController.toolbar 上使用 setToolbarItems: 方法。
  • 我知道,但是有问题的控制器是SVWebViewController,它是一个可重用的组件(它必须是一个子类)。

标签: iphone view uiviewcontroller uinavigationcontroller


【解决方案1】:

myViewController 子类中,创建一个类似这样的方法:

- (void)presentFromViewController:(UIViewController *)presentingViewController
{
    if ([[presentingViewController class] isEqual:[UINavigationController class]])
        [presentingViewController pushViewController:self.topViewController animated:YES];
    else
        [presentingViewController presentModalViewController:self animated:YES];
}

这行得通还是我理解不正确?

【讨论】:

  • 这比我在问题末尾写的内容略有改进。但理想情况下,我希望它完全透明(仍然使用pushViewControllerpresentModalViewController 方法呈现)。
  • 将此答案标记为已接受,因为这可能是我最好的选择,除了将我的 VC 分成 2 个不同的类(1 个 NVC 用于模式视图呈现和常规 VC 用于推送它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多