viewDidLoad никогда не вызывался в подклассе UIViewController - PullRequest
0 голосов
/ 26 ноября 2011

У меня возникли проблемы с загрузкой субклассированного UIViewController из пера.Моя функция viewDidLoad никогда не вызывается.

У суперкласса нет пера, но у подклассов есть свои.т.е.

@interface SuperClass : UIViewController {
}
@end


@interface SubClass : SuperClass{
}
@end
@implementation SubClass
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (void)viewDidLoad{
// Never called
}

Представление загружается из пера следующим образом:

SubClass *scvc = [[SubClass alloc]     initWithNibName:@"SubClass" bundle:nil];
    [self.navigationController pushViewController:scvc animated:YES];
    [scvc release];

Существует файл пера с этим именем, и для него правильно задан класс владельца файла.

viewDidLoad не вызывается у дочернего или супер.Есть идеи?

Ответы [ 4 ]

2 голосов
/ 26 ноября 2011

Вы говорите, что создаете представления в коде (используя loadView) в суперклассе, но пытаетесь использовать кончик в подклассе?

Согласно документам UIViewController (выделено мое)

Если вы задаете представления с помощью файла пера, вы не должны переопределять loadView , а должны вместо этого создать файл пера в Интерфейсном Разработчике ...

Похоже, у вас там может быть конфликт. В качестве теста закомментируйте метод loadView в вашем суперклассе и посмотрите, куда вас это приведет.

1 голос
/ 26 ноября 2011

Я предполагаю, что SuperClass реализует loadView.Поэтому, когда ваш подкласс запрашивается для loadView, вы получаете реализацию SuperClass, которая переопределяет обычный механизм загрузки пера.

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

Но, если вы хотите, вы должны быть в состоянии, по крайней мере, заставить это работать, выполнив это в вашем SubClass.m:

-(void)loadView {

    IMP defaultImp = class_getMethodImplementation([[self superclass] superclass], _cmd);

    /* or alternatively...
    IMP defaultImp = class_getMethodImplementation([UIViewController class], _cmd);
    */

    defaultImp(self, _cmd);
}

Это реализуетloadView для вашего подкласса, который пропускает loadView вашего SuperClass и вместо этого вызывает реализацию по умолчанию.

IMO, это уродливо и, возможно, потребуется пересмотреть, если ваша иерархия классов расширилась.Я бы не стал делать это в своем приложении, вместо этого я бы переосмыслил иерархию классов.

0 голосов
/ 26 ноября 2011

Где находится этот блок

SubClass *scvc = [[SubClass alloc]     initWithNibName:@"SubClass" bundle:nil];
    [self.navigationController pushViewController:scvc animated:YES];
    [scvc release];

Вы уверены, что он называется?

Я создал тестовый проект для его проверки, и следующие работы:

В вашем файле appDelegate.m я поместил следующее в метод didFinishLaunchingWithOptions приложения

UINavigationController *navController = [[UINavigationController alloc] init];
self.window.rootViewController = navController;

SubClass *viewController1 = [[[SubClass alloc] initWithNibName:@"SubClass" bundle:nil] autorelease];

[navController pushViewController:viewController1 animated:YES];

SuperClass.h

#import <UIKit/UIKit.h>

@interface SuperClass : UIViewController
@end

SuperClass.m

#import <UIKit/UIKit.h>
#import "SuperClass.h"

@implementation SuperClass
@end

SubClass.h

#import <UIKit/UIKit.h>
#import "SuperClass.h"

@interface SubClass : SuperClass
@end

SubClass.m

#import <UIKit/UIKit.h>
#import "SubClass.h"

@implementation SubClass

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    }
    return self;
}

- (void)viewDidLoad
{
    NSLog(@"Methods %@ called", NSStringFromSelector(_cmd));
    [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
}
@end

Это работает для меняУбедитесь, что вы правильно установили класс для nibFile.Нажмите на значок владельца файла и измените класс с UIViewController на SubClass

0 голосов
/ 26 ноября 2011

Попробуйте добавить:

[super viewDidLoad];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...