从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。有什么想法吗?
答案 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