【问题标题】:Initialize a view with a xib使用 xib 初始化视图
【发布时间】:2013-02-11 02:49:43
【问题描述】:

我想用 xib 初始化一个视图。那是一个 UIView。所以我有一个 xib 和一个 UIView 子类,下面粘贴了初始化代码(initWitFrame nibName)。在创建视图时,我将 xib 名称从视图控制器提供给初始化代码。

SubclassUIView *view = [[SubclassUIView alloc]initWithFrame:self.view.bounds nibName:@"xibName"];

我在正确的轨道上吗?到目前为止,xib 的内容并未随视图一起加载。

顺便说一句,xib 中的主视图设置为我的 UIView 子类的类类型。

- (id)initWithFrame:(CGRect)frame nibName:(NSString*)nibName
{
    self = [super initWithFrame:frame];
    if (self)
    {
        [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
        [self addSubview:self.view];
    }
    return self;
}

【问题讨论】:

    标签: objective-c xib nib


    【解决方案1】:

    从 NSBundle 返回的是一个 NSArray(视觉控件,主要是 UIViews)。 Appart的代码似乎是正确的。看看一个有效的例子:

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
    
            NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"TestView" 
                                                              owner:self 
                                                            options:nil];
    
            UIView* mainView = (UIView*)[nibViews objectAtIndex:0];
    
            [self addSubview:mainView];
        }
        return self;
    }
    

    【讨论】:

      【解决方案2】:

      @迈克 M: 此行为可能会导致随机崩溃。有时 NSApplication 对象会成为 firstObject -> 崩溃

      苹果文档: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html

      “nib加载代码调用对象的awakeFromNib方法的顺序不保证。在OS X中,Cocoa尝试最后调用File's Owner的awakeFromNib方法但不保证该行为。如果需要配置nib 文件中的对象在加载时更进一步,最合适的时间是在您的 nib-loading 调用返回之后。此时,所有对象都已创建、初始化并准备好使用。"

      【讨论】:

        猜你喜欢
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 2013-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多