尝试替换已弃用的 loadnibnamed:owner

Posted

技术标签:

【中文标题】尝试替换已弃用的 loadnibnamed:owner【英文标题】:Trying to replace deprecated loadnibnamed:owner 【发布时间】:2013-10-26 03:10:56 【问题描述】:

我正在尝试替换已弃用的

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

我有什么遗漏吗?这对我来说似乎很直接。

【问题讨论】:

我也遇到了同样的问题,请问您找到解决办法了吗 【参考方案1】:

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

已弃用的调用保留了 nib 中***对象的所有权,而新调用则不保留。

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

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

【讨论】:

那么有什么解决办法,我的出口很强大,但它仍然隐藏 @Retro - 听起来你有一个不同的问题,如果你有一个强引用,则不会收集对象。提出您自己的问题,提供代码的详细信息、出了什么问题以及您尝试过什么 - 然后有人可能会帮助您。【参考方案2】:

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

的错误

[__NSArrayM insertObject:atIndex:]: object cannot be nil' terminating with unaught exception of type NSException abort() called

因为我的***对象在哪里为零。

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

【讨论】:

以上是关于尝试替换已弃用的 loadnibnamed:owner的主要内容,如果未能解决你的问题,请参考以下文章

Snapkit 常量替换已弃用的 .priorityMedium() .priorityHigh() .priorityLow()?

替换 Java Awt 已弃用的方法

什么是已弃用的 getSupportLoaderManager() 的适当替换?

替换已弃用的 `keypress` DOM 事件

jQuery:替换已弃用的“.load()”? [复制]

用 QuerydslJpaPredicateExecutor 替换已弃用的 QuerydslJpaRepository 失败