【问题标题】:question about init and load from xib for a custom UIView关于自定义 UIView 从 xib 初始化和加载的问题
【发布时间】:2011-11-03 18:03:19
【问题描述】:

我正在尝试创建一个自定义 UIView 类,该类从包含该视图接口的 xim 文件加载。我正在尝试将 [NSBundle mainBundle] loadNibNamed...] 封装在我的自定义视图的 init 方法中,如下所示:

- (id)init 
{    
    self = [super init];
    if (self) 
    {
        NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"LoadingV" owner:self options:nil];
        self = [(LoadingV*)[nibViews objectAtIndex: 0] retain];
    }
    return self;
}

我想知道:

  1. 这是一种可接受的方式吗?还有没有更好的方法?
  2. 鉴于我没有在 dealloc 中调用 [self release],我是否应该保留“保留”?

干杯 自动对焦

【问题讨论】:

    标签: iphone


    【解决方案1】:

    不,这是不可接受的,这是一种不好的做法,而且实际上存在内存泄漏。

    更好的方法是使用称为“工厂”的模式。

    例子:

    @interface CustomView: UIView
    @end
    
    @implementation CustomView
    - (void)awakeFromNib {
        // custom view loaded from nib
    }
    @end
    
    @interface UIView (Nib)
    + (UIView *)viewFromNib:(NSString *)nibName bundle:(NSBundle *)bundle;
    @end
    
    @implementation UIView (Nib)
    + (UIView *)viewFromNib:(NSString *)nibName bundle:(NSBundle *)bundle {
        if (!nibName || [nibName length] == 0) {
            return nil;
        }
    
        UIView *view = nil;
    
        if (!bundle) {
            bundle = [NSBundle mainBundle];
        }
    
        // I assume, that there is only one root view in interface file
        NSArray *loadedObjects = [bundle loadNibNamed:nibName owner:nil options:nil];
        view = [loadedObjects lastObject];
    
        return view;
    }
    @end
    

    用法:

    // CustomView.xib contains one View object with its class set to "CustomView"
    CustomView *myView = (CustomView *)[UIView viewFromNib:@"CustomView" bundle:nil];
    

    【讨论】:

    • 感谢您的回复。您在您的工厂函数中使用的逻辑几乎与我拥有的逻辑相似(仅当我删除保留时)。但是你的函数是一个不与自身关联的类方法。如果我需要有一个调用其他成员函数的自定义视图对象,我该怎么办?
    • UIView 有 awakeFromNib 方法,你可以自定义它。
    • awakeFromNib 对我没有用,因为我正在尝试从 xin 加载自定义视图。那个电话还没有被调用!
    • 创建 XIB 文件,将 View 对象放入该文件,选择它并将其类设置为您的自定义类。这正是你想要的。
    • 我已经在这样做了。问题是当我想实例化该自定义视图并加载其 xib 文件时。这就是我想要达到的目标。上面的代码做到了,但只是想知道是否有更好的方法
    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 2015-02-03
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多