objective-c – 以编程方式从nib的NSView子类加载对象

objective-c – 以编程方式从nib的NSView子类加载对象,第1张

概述如何正确加载使用Xib的NSView子类的对象? 我想要动态加载,从一开始,所以我做了一个MyView.Xib 从MyDocument.m我做到了: MyView *myView = [[MyView alloc] initWithFrame:...];[NSBundle loadNibNamed:@"MyView" owner:myView];[someview addSubview:myV 如何正确加载使用Xib的NSVIEw子类的对象?

我想要动态加载,从一开始,所以我做了一个MyVIEw.Xib
从Mydocument.m我做到了:

MyVIEw *myVIEw = [[MyVIEw alloc] initWithFrame:...];[NSBundle loadNibnamed:@"MyVIEw" owner:myVIEw];[somevIEw addSubvIEw:myVIEw];...

并且背景很好(它叫做drawrect:它按照预期绘制)
但是我放在xib上的所有按钮都不会出现。
我已经检查,他们被加载,但他们的supervIEw与myVIEw不一样的对象。

为什么是这样?我想我在Xib中缺少一些东西,但我不知道究竟是什么。
换句话说:我如何确保我的xib中的根视图与文件所有者是一样的对象?

我希望有一些类似于mac的东西:

NSArray* nibVIEws =  [[NSBundle mainBundle] loadNibnamed:@"MyVIEw" owner:self options:nil]; //in iOS this will load the xibMyVIEw* myVIEw = [ nibVIEws objectAtIndex:1];[somevIEw addSubvIEw:myVIEw];...

提前致谢。

编辑

我想我已经意识到问题的起源…(??)

在MyVIEw类中,我有各种IBOutlet在IB中正确连接,这就是为什么它们加载正常(我可以参考它们)。不过没有IBOutlet的顶视图。所以当NSBundle加载笔尖时,顶视图被分配给其他对象。我认为这将发生,如果我设置我的顶级视图在IB是从类:MyVIEw并将myVIEw作为所有者在[NSBundle loadNibnamed:@“MyVIEw”所有者:myVIEw];但似乎并非如此。
我究竟做错了什么?

解决方法 请注意,nib文件包含:

>一个或多个顶级对象。例如,MyVIEw的一个实例;
>文件的所有者占位符。这是在加载nib文件之前存在的对象。由于它存在于nib文件被加载之前,它不能与nib文件中的视图相同。

情景1:NSNib

让我们考虑一下,你的nib文件只有一个顶级对象的类是MyVIEw,文件的所有者类是MyAppDelegate。在这种情况下,考虑到nib文件是以MyAppDelegate的实例方法加载的:

NSNib *nib = [[[NSNib alloc] initWithNibnamed:@"MyVIEw" bundle:nil] autorelease];NSArray *topLevelObjects;if (! [nib instantiateWithOwner:self topLevelObjects:&topLevelObjects]) // errorMyVIEw *myVIEw = nil;for (ID topLevelObject in topLevelObjects) {    if ([topLevelObject isKindOfClass:[MyVIEw class]) {        myVIEw = topLevelObject;        break;    }}// At this point myVIEw is either nil or points to an instance// of MyVIEw that is owned by this code

它看起来像 – [NSNib instantiateNibWithOwner:topLevelObjects:]的第一个参数可以是零,所以你不必指定一个所有者,因为你似乎没有兴趣有一个:

if (! [nib instantiateWithOwner:nil topLevelObjects:&topLevelObjects]) // error

尽管如此,我不会依赖它,因为它没有记录。

请注意,您拥有顶层对象的所有权,因此,在不再需要时,您将负责将其释放。

情景2:NSVIEwController

Cocoa提供NSVIEwController来管理视图;通常,从nib文件加载的视图。您应该创建一个NSVIEwController的子类,其中包含需要的插座。编辑nib文件时,请设置视图插座和您可能定义的其他插槽。您还应该设置nib文件的所有者,使其类是NSVIEwController的这个子类。然后:

MyVIEwController *myVIEwController = [[MyVIEwController alloc] initWithNibname:@"MyVIEw" bundle:nil];

NSVIEwController自动加载nib文件,并在发送视图时设置相应的出口。或者,您可以强制它通过发送它来加载nib文件-loadVIEw。

总结

以上是内存溢出为你收集整理的objective-c – 以编程方式从nib的NSView子类加载对象全部内容,希望文章能够帮你解决objective-c – 以编程方式从nib的NSView子类加载对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1036762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存