self.NavigationController равен нулю, даже если вызывается с помощью initWithRootViewController - PullRequest
1 голос
/ 27 февраля 2012

Я не могу понять, что я делаю не так, у меня есть другие посты об этом, но они, кажется, связаны с более четко сформулированным случаем, в моей ситуации все кажется очень простым, но все же это не работает .

В моем AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    MyViewController *vc = [[MyViewController alloc] init];

    UINavigationController *navigationController = 
            [[UINavigationController alloc] initWithRootViewController:vc];

    // Instantiate the window
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = navigationController;

    // Show the window
    [self.window makeKeyAndVisible];
    return YES;     
}

В MyViewController.m (нет файла xib)

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"self.navigationController %@", self.navigationController);
}

Результат этого:

2012-02-26 22:41:19.366 Test [4488:15203] self.navigationController (null)

EDIT

Итак, я почти понял, но не понял причину.

Прежде всего, чтобы лучше определить, мои контроллеры представления были UITableViewControllers, и проблема, очевидно, связана с настройкой метода initWithStyle, которую я сделал:

- (id)init
{
    self = [self initWithStyle:UITableViewStyleGrouped];
    return self;
}

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        [[self tableView] setBackgroundColor:kTableViewBackgroundColor]; 
        [[self tableView] setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
    }
    return self;
}

Если я закомментирую две строки внутри if, то есть, если я сделаю:

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        //[[self tableView] setBackgroundColor:kTableViewBackgroundColor]; 
        //[[self tableView] setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
    }
    return self;
}

self.NavigationController создается должным образом, в противном случае это не так. Может кто-нибудь объяснить мне, почему это происходит?

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Когда вы переопределяете метод init, это, в основном, означает свойства метода доступа к контроллеру представления суперкласса, у которого свойство navController установлено в nil, и вместо этого у вас установлено свойство tableView.

Вы можете установить стиль просмотра таблицы и другие свойства в viewDidLoad

1 голос
/ 27 февраля 2012

Что внутри вашего метода инициализации?Вы переопределили этот метод?Если нет, вам, вероятно, следует или использовать метод initWithNibName:bundle: из Apple Reference :

Возвращает вновь инициализированный контроллер представления с файлом пера в указанном комплекте.

И из файла UIViewController.h:

/*
  The designated initializer. If you subclass UIViewController, you must call the super implementation of this
  method, even if you aren't using a NIB.  (As a convenience, the default init method will do this for you,
  and specify nil for both of this methods arguments.) In the specified NIB, the File's Owner proxy should
  have its class set to your view controller subclass, with the view outlet connected to the main view. If you
  invoke this method with a nil nib name, then this class' -loadView method will attempt to load a NIB whose
  name is the same as your view controller's class. If no such NIB in fact exists then you must either call
  -setView: before -view is invoked, or override the -loadView method to set up your views programatically.
*/
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...