【问题标题】:iPhone - Load a UIView from a nib file?iPhone - 从 nib 文件加载 UIView?
【发布时间】:2011-05-05 17:42:50
【问题描述】:

我正在对 UIView 进行子类化,试图从 nib 文件加载我在界面生成器中放置的视图。 我在返回线上收到以下错误:

由于未捕获的异常“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];
}

【问题讨论】:

    标签: iphone objective-c uiview subclassing


    【解决方案1】:

    你做的很奇怪)

    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
    

    【讨论】:

    • 除了将自定义类设置为 MyView 之外,您还需要做什么才能在另一个 nib 中使用 MyView
    【解决方案2】:

    而不是self = [objects objectAtIndex:0],你应该循环遍历数组并确保你得到了正确的对象,例如:

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

    也就是说,我一直在做这件事,并将参考从UIViewController 中提取出来。不过,这会破坏抽象层,因为只想使用视图的类需要知道 Nib 所在的位置:

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

    【讨论】:

    • 这不是问题,数组中只有1个对象,第一个总是正确的
    • 我不想使用 viewController,我想要的只是一个从 nib 生成的自定义视图
    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2011-07-21
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多