不了解NavigationController和UIViewControllers如何在iOS中工作

时间:2014-03-24 22:23:10

标签: ios objective-c uiview uiviewcontroller uinavigationcontroller

我有一个项目,我不太了解背后的意见和导航。我从AppDelegateMAAppDelegate)开始,在那里定义属性:

@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内容(整个用户界面以编程方式完成,没有笔尖或故事板)。以下是viewDidLoad的{​​{1}}:

MAController

我继续(在- (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]; 课程中创建了一个viewController,它被称为AppDelegate,因此我认为它是对此的裁判,但现在我已经更改了它(在{ {1}})到view,我猜我错了?

最后,我在'viewDidLoad`中创建了一个AppDelegate

viewController

并开始向我创建的UIView新的UIView添加一组子视图。

所以,简而言之,我不知道发生了什么。后来,当我尝试告诉(来自UIView *header = [[UIView alloc] initWithFrame:headerFrame]; header.backgroundColor = [UIColor clearColor]; self.tableView.tableHeaderView = header; 内的方法)header(我假设是MAController负责我项目中的所有内容 - 在{{1 {}}} self.navigationController我要用作表格的detailView的新navigationController,它很奇怪。

所以我只是想了解什么是控件,AppDelegate是什么,以及发生了什么。

2 个答案:

答案 0 :(得分:1)

首先,花一点时间阅读导航控制器的工作原理。文档非常有用:

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做任何事情。也许这让你感到困惑。

答案 1 :(得分:1)

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

更改:

self.window.rootViewController = viewController;

为:

self.window.rootViewController = navController;

编辑:

您可以通过询问appDelegate从任何地方访问navigationController。通常认为这不是一个好习惯:

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

不要忘记:

#import "MAAppDelegate.h"