是否需要UINavigationController才能执行pushViewController?

时间:2011-09-20 03:05:22

标签: iphone uiviewcontroller uinavigationcontroller

我认为我的问题的答案是“是”,但我想得到所有人的确认。

我有一个UITableView,当我选择一行时,它应该“滑动”到另一个UIViewController。 我之前已经使用其他应用程序完成了这项工作(并且它们包含了UINavigationController,但是在UITabView中)。

所以我想知道: 是否需要UINavigationController才能使用self.navigationController pushViewController?

如果是这样(我怀疑这是真的),我必须在哪里定义UINavigationController? 在AppDelegate?在主/主UIViewController?

2 个答案:

答案 0 :(得分:4)

是的,您需要有一个UINavigationController来执行pushViewController。但是,没有一个地方你必须定义它。如果整个应用程序中的每个视图控制器都是一个UINavigationController的一部分,那么将它放在App Delegate中是有意义的。但是,您可以随时分配和使用视图控制器。 (请注意,它是一个UIViewController子类。)您还可以在应用程序中使用多个UINavigationControllers(这很常见,例如,如果您有一个Tab栏)。所以你可以随时创建UINavigationControllers。

如果您正在寻找其他视图控制器的替代方法,您可以使用其他一些选项。例如,

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

允许您从一个视图控制器转换到另一个视图控制器,并且可以在没有UINavigationController的情况下使用。但我认为导航控制器通常是从一个视图控制器移动到另一个视图控制器的最佳方式。

答案 1 :(得分:3)

简短的回答是:是的。

UINavigationController的设计目的是在屏幕上和屏幕外管理和动画一堆视图控制器(与导航栏或工具栏等其他一些界面元素一起使用)。传统上,UINavigationControllers由App Delegate强烈保存和初始化,因为它们被认为是最高优先级的根对象。显示UINavigationController正确用法的示例类可能如下所示:

#import <UIKit/UIKit.h>

@interface CFIExampleAppDelegate : NSResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;
@property (nonatomic, strong) UINavigationController *navigationController;

@end

@implementation CFIExampleAppDelegate

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc]initWithFrame:UIScreen.mainScreen.bounds];
    self.navigationController = [[UINavigationController alloc]initWithRootViewController:/*Some Controller Instance*/];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];

    return YES;
}

@end

一如既往,答案很长。

UINavigationController可以简单地重新实现(并且它已经很多次),效果很好。它就像子类化UIViewController一样简单,并且可以在某种堆栈上进行螺栓连接(比如NSMutableArray)。