Cocoa:如何独立地多次使用NSNib

Elb*_*mio 6 cocoa view objective-c nib viewcontroller

我已经问过如何让自定义视图重复自己分成几个单独的副本,并告诉我应该使用NSNib或NSViewController.我在nib文件中有一个自定义视图,每当用户单击一个按钮时,我想要显示一个的nib视图副本,同时仍然在屏幕上的其他位置维护前一个,同时运行多达十个单独的视图.由于这些中的每一个在出现之前都需要一些用户输入,我认为它们必须是每个单独的对象或某些东西,以使它们不同并且不会相互干扰.

我可以使用第一个视图

NSNib *nib = [[NSNib alloc] initWithNibNamed:@"IndividualTimers" bundle:nil];

[nib instantiateNibWithOwner:self topLevelObjects:nil];
Run Code Online (Sandbox Code Playgroud)

但是,每次按下按钮时,只会重新启动相同的视图,我可以看出两个视图已合并到该视图中,因为显示在其上的计时器开始滴答速度的两倍,但它们应该在两个不同的实例中独立显示的观点.

有人告诉我应该使用设置不同文件的所有者.

到目前为止,人们一直很有帮助,但不是很具体.我不知道我应该设置什么文件的所有者,如何以编程方式创建一个新对象来保存加载的笔尖的每个实例(如果这甚至是如何完成),或者我是否需要为每个加载单独的对象.

基本上,我想知道如何获取一个nib文件,并将其用作模板,最多可以加载十次,而每个(最多)十个视图同时运行,但是独立运行.

我非常感谢您提供的任何具体帮助,因为这是我在Xcode编程时遇到的最大问题.我被困了几个星期.谢谢你的帮助.

tit*_*coy 7

实例化nib文件时,它会将未归档的对象分配给其文件所有者的属性.

如果将IBOutlet UIView属性连接到nib中的根视图,则在实例化nib时,新创建的对象将分配给该属性.

为了在每次实例化nib时创建新对象,您需要将IBOutlet属性的值复制到其他位置,因为在下次实例化nib时它将被覆盖.


例如,假设您已将timerViewFromNib属性连接到nib文件中的NSView:

@property (nonatomic, assign) IBOutlet NSView *timerViewFromNib;
@property (nonatomic, assign) NSView *timerView1;
@property (nonatomic, assign) NSView *timerView2;
Run Code Online (Sandbox Code Playgroud)

您可以添加获取并显示该视图的两个不同实例,如下所示:

NSNib *nib = [[NSNib alloc] initWithNibNamed:@"IndividualTimers" bundle:nil];

[nib instantiateNibWithOwner:self topLevelObjects:nil];
self.timerView1 = self.timerViewFromNib;
self.timerView1.frame = CGRectMake(...);
[self.view addSubview:self.timerView1];

[nib instantiateNibWithOwner:self topLevelObjects:nil];
self.timerView2 = self.timerViewFromNib;
self.timerView2.frame = CGRectMake(...);
[self.view addSubview:self.timerView2];

self.timerViewFromNib = nil;
Run Code Online (Sandbox Code Playgroud)