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

时间:2011-08-03 00:40:34

标签: objective-c cocoa view nib viewcontroller

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

我可以使用

显示第一个视图
NSNib *nib = [[NSNib alloc] initWithNibNamed:@"IndividualTimers" bundle:nil];

[nib instantiateNibWithOwner:self topLevelObjects:nil];

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

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

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

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

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

1 个答案:

答案 0 :(得分: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;

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

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;