viewDidLoad从未在子类UIViewController中调用

时间:2011-11-26 16:40:29

标签: ios ios4

从nib加载子类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];

有一个带有此名称的nib文件,它正确设置了文件所有者的类。

在子级或超级中未调用viewDidLoad。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

你说你是在超类中用代码创建视图(使用loadView),但是试图在子类中使用nib?

根据UIViewController文档(强调我的)

  

如果使用nib文件指定视图,不得覆盖loadView ,而应在Interface Builder中创建一个nib文件...

看起来你可能在那里发生冲突。作为测试,在超类中注释掉loadView方法并查看它的位置。

答案 1 :(得分:1)

我假设SuperClass实现了loadView。因此,当您的SubClass被要求加载View时,您将获得SuperClass的实现,这将覆盖正常的nib加载机制。

我会在这里重新考虑你的设计。您的SuperClass的行为与您希望SubClass的行为完全不同。也许这不是那里最好的关系。

但是,如果你愿意,你应该能够通过在你的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,它跳过SuperClass的loadView并调用默认实现。

IMO,这很丑陋,如果您的类层次结构扩展,可能需要重新访问。我不会在自己的应用程序中执行此操作,而是重新考虑类层次结构。

答案 2 :(得分:0)

尝试添加:

[super viewDidLoad];

答案 3 :(得分:0)

此块位于何处

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