【问题标题】:Not understanding how the NavigationController and UIViewControllers are working in iOS不了解 NavigationController 和 UIViewControllers 在 iOS 中是如何工作的
【发布时间】:2014-03-24 22:23:09
【问题描述】:

我有一个项目,我不太了解背后的视图和导航。我从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)更改为@987654342 @,我想我想错了吗?

最后,我在“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,我将用作表格的详细视图,它变得很奇怪。

所以我只是想了解什么可以控制,rootViewController 是什么,以及正在发生的事情。

【问题讨论】:

  • rootViewController 就是这样 - 应用程序中的起始(或初始)视图控制器。您的第一个问题是您将viewController 设置为navigationController 的初始视图控制器和应用程序的根视图控制器。您应该设置 self.window.rootViewController=navController。或者使用故事板 - 在使用 IB 的人和喜欢以编程方式创建一切的人之间,这可能有点“宗教”,但我发现故事板要快得多
  • 请详细说明“它变得很奇怪”是什么意思。

标签: ios objective-c uiview uiviewcontroller uinavigationcontroller


【解决方案1】:

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

变化:

self.window.rootViewController = viewController;

到:

self.window.rootViewController = navController;

编辑:

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

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

别忘了:

#import "MAAppDelegate.h"

【讨论】:

  • 如何访问MAAppDelegateMAController 类中创建的navController?只是self.navController
  • 这通常不是一个好习惯,但您可以通过询问您的应用程序委托来获取 navigationController: AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; UINavigationController *nav = delegate.navigationController;
【解决方案2】:

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

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

【讨论】:

  • 我明天要查看文档,谢谢,detailViewControl 我用于主详细信息类型 TableViewdetailViewControl UIView 用于详细信息一些表格单元格。
  • 如何访问我在MAAppDelegateMAController 类中创建的navController?只是self.navController
  • 是的,在这种情况下,这就是您访问 MAController 的导航控制器的方式。
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
相关资源
最近更新 更多