尝试替换已弃用的loadnibnamed:owner

时间:2013-10-26 03:10:57

标签: objective-c macos cocoa nsbundle

我正在尝试替换已弃用的

[NSBundle loadNibNamed:@"Subscriptions" owner:self];

用这个代替(只有我能找到相同的东西)

[[NSBundle mainBundle] loadNibNamed:@"Subscriptions" owner:self topLevelObjects:nil];

但是对话框会弹出并立即消失,而不是保持打开状态,就像使用已弃用的呼叫一样。

此代码位于像这样的viewcontroller中。

- (id)init{
    self = [super init];
    if (self) {
        //[NSBundle loadNibNamed:@"Subscriptions" owner:self];

        [[NSBundle mainBundle] loadNibNamed:@"Subscriptions" owner:self topLevelObjects:nil];
    }
    return self;

}

我正在从appdelegate这样调用它。

SubscriptionsViewController *subscriptionsViewController = [[SubscriptionsViewController alloc] init];
[subscriptionsViewController.window makeKeyAndOrderFront:self];

有什么我想念的吗?对我来说似乎很直接。

2 个答案:

答案 0 :(得分:1)

出现然后消失的对话框是可能的对象集合的标志 - 强烈引用对话框,它将被收集和丢失。

弃用的呼叫保留了笔尖中顶级对象的所有权,新呼叫没有。

因此,引用顶级对象的所有者对象的属性必须很强,或者您需要保留顶级对象数组。这与此类属性较弱的旧建议相反。

引用nib中非顶级对象的属性仍然很弱。

答案 1 :(得分:1)

我在使用loadNibNamed: owner: topLevelObjects:时遇到了类似的问题,并且总是遇到类似

的错误
  

[__ NSArrayM insertObject:atIndex:]:object不能为nil'以NSException类型的未捕获异常终止abort()调用

因为我的顶级对象是nil。

我终于发现我加载的nib文件的Interface Builder版本设置为" Xcode 4.6"。当我将其设置为6.2时,一切都恢复正常。

enter image description here