ios - 不了解 NavigationController 和 UIViewControllers 在 iOS 中的工作方式

标签 ios objective-c uiview uiviewcontroller uinavigationcontroller

我有一个项目,我不太了解背后的 View 和导航。我从 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 或 Storyboard)。这是 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 添加一堆 subview ,就像这样

[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 添加一堆 subview header

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

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

最佳答案

主窗口根设置为 View Controller 而不是导航 Controller

改变:

self.window.rootViewController = viewController;

到:

self.window.rootViewController = navController;

编辑:

您可以通过询问您的 appDelegate 从任何地方访问 navigationController。这通常不被认为是一种好的做法:

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

不要忘记:

#import "MAAppDelegate.h"

关于ios - 不了解 NavigationController 和 UIViewControllers 在 iOS 中的工作方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22621843/

相关文章:

ios - 从日期为今天的数组中获取元素

带有 UINavigationController 的 iOS 7 自定义转换

ios - 具有 UITapGestureRecognizer 操作的 UICollectionViewCell 仅在状态 3 下调用一次

ios - 在 CollectionView 上按需滚动加载更多数据

iphone - 触发 addSubview 方法

ios - 无法更改从 Nib 加载的 UIView 的高度

ios - SWRevealViewController 后 View 尺寸

ios - 范围超出范围大小 4 objective-c

ios - 如何使用 objective-c 在 UIWebView IOS 中打开 file.xlsx

ios - 翻转容器内的 View ,显示第二个 View