将一个UIViewController包装在UINavigationController中

7

我希望我的视图控制器能拥有自己的导航栏。相对于显示/隐藏现有的导航栏,我发现这样更容易。下面的代码是有效的。这是反模式还是相对常见的做法?

MyViewController *viewController = [[MyViewController alloc] init] 
                                    autorelease];

UINavigationController *wrapper = [[[UINavigationController alloc] 
                                   initWithRootViewController:viewController] 
                                    autorelease];

[self.navigationController presentViewController:wrapper 
                                        animated:YES 
                                      completion:nil];
3个回答

5
为了呈现一个带有导航栏和自己的导航堆栈的模态视图控制器,您发布的代码是完全正确的。您唯一需要注意的是,在现有导航控制器的堆栈中 推送 第二个 UINavigationController 会引起问题。

在原始问题的背景下,self.navigationController presentViewController...self presentViewController...之间有区别吗? - SundayMonday
2
没有区别。即使您调用 [self presentViewController:...],包装器的 presentingViewController 属性中也会显示 self.navigationController - Joe Hankin

2

在Swift中:

let mainViewController = MainViewController()
let navigationController = UINavigationController(rootViewController: mainViewController)
present(navigationController, animated: true, completion: nil)

1

任何我需要在上面有NavigationBar的静态UIView,我都会在Interface Builder中创建。由于您正在以模态方式呈现viewController(我假设),您是否需要整个UINavigationController取决于您自己。只要您不将一个navigationController的rootView推入另一个navigationController中,这将在第一个下创建一个navigationBar,就没有大问题。

当我呈现“登录”类型的表单或类似表单时,它将具有“完成”和“取消”按钮,我将只创建一个带有这些项目的XIB并呈现它。

如果您正在寻找一种快速的方法来全部使用代码完成此操作,则您所做的一切都没有问题。您将轻松访问tintColor和title。您可以在IB中执行此操作,但必须为所有对象连接IBOutlet。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接