需要一个UINavigationController才能执行pushViewController吗?

3
我认为我的问题的答案是“是”,但我想向每个人确认一下。
我有一个UITableView,当我选择一行时应该“滑动”到另一个UIViewController。 我之前用其他应用程序做过这件事(它们包括UINavigationController,尽管在UITabView中)。
所以我想知道: 是否需要UINavigationController才能使用self.navigationController pushViewController?
如果是这样(我再次怀疑),那么我必须在哪里定义UINavigationController? 在AppDelegate中? 在主/基本UIViewController中?

要推送一个视图控制器,你需要向UINavigationController发送该消息;如果你需要推送视图控制器,你需要一个基于导航的应用程序,其中有一个UINavigationController,你可以添加任何你想要的东西(一个视图控制器作为navController的根,UITableView或任何其他视图)。 - Herz Rod
2个回答

4
是的,您需要一个UINavigationController才能执行pushViewController操作。然而,并没有一个地方是您必须定义它的。如果您整个应用程序中的每个视图控制器都是一个UINavigationController的一部分,则将其放置在App Delegate中是有意义的。但是,您可以在任何时候分配和使用视图控制器。(请注意它是一个UIViewController子类)。您还可以在应用程序中拥有多个UINavigationController(例如,如果您有一个选项卡栏),因此您可以随时创建UINavigationController。
如果您正在寻找呈现其他视图控制器的替代方法,您确实有一些不同的选择。例如,
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

这个方法可以让你从一个视图控制器转到另一个视图控制器,而且可以在没有导航控制器的情况下使用。但是我认为导航控制器经常是从一个视图控制器转到另一个视图控制器的最佳方式。


3

简短回答:是的。

UINavigationController的设计目的是管理和动画化一堆视图控制器在屏幕上进出(与导航栏或工具栏等其他接口元素相结合)。传统上,由于被认为是顶级根对象,UINavigationControllers会由App委托强力持有并初始化。以下是一个展示正确使用 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)即可。

好的,谢谢。你有一个清晰的例子(链接、代码片段)吗? - AlvinfromDiaspar
无论你要做什么,祝你好运 :) - CodaFi

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