我有一个项目,我不太了解背后的视图和导航。我从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或故事板)。以下是MAController
的viewDidLoad
:
- (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
做任何事情。也许你也很困惑