不理解NavigationController和uiviewcontroller是如何在iOS中工作的



我有一个项目,我不太了解背后的视图和导航。我从AppDelegate (MAAppDelegate)开始,在这里定义属性:

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UIViewController *detailViewController;

然后在MAAppDelegate.m,我创建一个navigationController,和

@implementation MAAppDelegate
@synthesize detailViewController;
@synthesize window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Init the navController for the Master Detail View of the grade cells
    UINavigationController *navController = [[UINavigationController alloc] init];

    detailViewController = [[UIViewController alloc] init];
    UIViewController *viewController = [[MAController alloc] init];
    navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

所以在这一点上,我认为我有一个工作的naviationController,我已经设置了一个自定义UIViewController的实例(自定义类MAController),我已经把它设置为rootViewController

然后,在我的MAController类中,我做的所有我的UI的东西的类(整个UI是编程完成的,没有nib或故事板)。以下是MAControllerviewDidLoad:
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [self.navigationController setNavigationBarHidden:YES]; // I commented this line out and realized it does nothing

我继续(在viewDidLoad)添加一堆子视图到self.view,像这样

[self.view addSubview:self.backgroundImageView];

早些时候,我在AppDelegate类中创建了一个viewController,它被称为view,所以我认为它是裁判,但现在既然我已经改变了它(在AppDelegate)到viewController,我想我想错了?

最后,我在viewDidLoad中创建一个UIView:

UIView *header = [[UIView alloc] initWithFrame:headerFrame];
header.backgroundColor = [UIColor clearColor];
self.tableView.tableHeaderView = header;

并开始添加一堆子视图到这个新的UIView我创建了header

所以,简而言之,我不知道发生了什么。后来,当我试图告诉(从MAController内的方法)self.navigationController(我假设是navigationController负责我项目中的一切-在AppDelegate开始创建)到pushViewController一个新的viewController,我要用它作为一个表的detailView,它变得奇怪。

所以我只是想了解什么有控制,rootViewController是什么,以及发生了什么。

主窗口根被设置为视图控制器而不是导航控制器

改变:

self.window.rootViewController = viewController;

:

self.window.rootViewController = navController;
编辑:

你可以通过请求appDelegate从任何地方访问navigationController。这通常不被认为是一个好的实践:

MAAppDelegate *delegate = (MAAppDelegate *)[[UIApplication sharedApplication] delegate];
UINavigationController *nav = delegate.navigationController;

别忘了:

#import "MAAppDelegate.h"

首先,花一点时间阅读导航控制器是如何工作的。文档真的很有帮助:

https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html

第二,你的问题是你的窗口的根视图控制器不是你创建的导航控制器。相反,它是MAController的一个实例。这就是你正在做的:

UIViewController *viewController = [[MAController alloc] init];
// some other code ...
self.window.rootViewController = viewController;

我想你的意思是添加MAController作为导航控制器的根视图控制器,并使导航控制器你的窗口的根。如果是这样,你会想这样设置你的视图控制器:

UIViewController *viewController = [[MAController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
self.window.rootViewController = navController;

另一个潜在的问题是,你似乎没有用你的detailViewController做任何事情。也许你也很困惑

最新更新