iPhone - 从nib文件加载UIView?

问题描述:

我是继承UIView试图加载视图,我从界面生成器从nib文件中删除。 我上回线以下错误:iPhone - 从nib文件加载UIView?

终止应用程序由于未捕获的异常“NSGenericException”,理由是:“这个编码器需要更换的对象从的initWithCoder返回:”

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    [super initWithCoder:aDecoder]; 
    NSArray *objects = [[NSBundle mainBundle] 
         loadNibNamed:@"MyView" 
         owner:nil 
         options:nil]; 
    if (self = [objects objectAtIndex:0]) 
    { 
    } 
    return [self retain]; 
} 

你正在做的事情很奇怪)

loadNibNamed:owner:options:将调用initWithCoder:实例你从xib的视角。但是您从initWithCoder:打电话给loadNibNamed:owner:options:。无限递归?

要加载视图从XIB可以执行下一个:

@implementation MyView 

+ (MyView*) myView 
{ 
    NSArray* array = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil]; 
    return [array objectAtIndex:0]; // assume that MyView is the only object in the xib 
} 

@end 
+0

除了将自定义类设置为“MyView”之外,为了在另一个笔尖使用“MyView”还有什么特别之处吗? – qix 2014-01-02 10:47:02

相反不是做self = [objects objectAtIndex:0]你应该遍历数组,并确保您得到合适的对象,例如:

for (id object in objects) { 
    if ([object isKindOfClass:[YourClassName class]]) 
     self = (YourClassName*)object; 
} 

这么说,我已经送花儿给人s完成了这一层,并从UIViewController中取出参考。这打破了抽象层,虽然,因为这只是想使用的视图类需要知道什么笔尖其:

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"MyView" bundle:nil]; 
YourClassName* view = (YourClassName*)vc.view; 
[vc release]; 
+0

这不是问题,只存在1数组中的对象,第一个是总是正确的 – aryaxt 2010-11-05 20:22:00

+2

和我不想要使用viewController,我想要的只是一个从笔尖生成的自定义视图 – aryaxt 2010-11-05 20:22:52