5

我正在尝试替换已弃用的

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

用这个代替(唯一我能找到的东西是等价的)

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

但是对话框会立即弹出并消失,而不是像处理已弃用的调用那样保持打开状态。

这段代码在这样的视图控制器中。

- (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];

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

4

2 回答 2

1

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

不推荐使用的调用保留了 nib 中顶级对象的所有权,而新调用则没有。

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

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

于 2013-10-26T04:02:53.487 回答
1

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

[__NSArrayM insertObject:atIndex:]: object cannot be nil' 以未捕获的类型为 NSException abort() 的异常终止

因为我的顶级对象在哪里为零。

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

在此处输入图像描述

于 2015-05-10T12:20:18.837 回答