【问题标题】:Cocoa : How to use NSNib several times independentlyCocoa:如何独立使用 NSNib 多次
【发布时间】:2011-10-18 17:23:46
【问题描述】:

我问过如何将自定义视图重复成几个单独的副本,并被告知我应该使用 NSNib 或 NSViewController。我在 nib 文件中有一个自定义视图,每当用户单击一个按钮时,我都希望出现一个 nib 视图的 new 副本,同时仍将前一个视图保留在屏幕上的其他位置最多十个独立的视图同时运行。由于它们中的每一个在出现之前都需要一些用户输入,因此我认为它们必须是单独的对象或某种东西才能使它们与众不同并且不会相互干扰。

我可以使用

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

[nib instantiateNibWithOwner:self topLevelObjects:nil];

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

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

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

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

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

【问题讨论】:

  • 多次实例化时的 self 是什么?是同一个对象吗?这可能是您问题的根源。 self 是什么类型的对象?
  • 我猜这是类的特定实例(其中只有一个),这就是为什么我认为他们告诉我,无论何时开始操作,都会重用同一个对象,而不是正在创建一个新的。
  • 我认为您需要提供有关此代码在哪个类中调用的更多信息。
  • 通过打印出 self NSLog(@"obj=%@", self) 的值或使用调试器来尝试调试。
  • 记录它只是给出:obj= InputClass 是使用 NSNib 的类的名称

标签: objective-c cocoa view nib viewcontroller


【解决方案1】:

当您实例化一个 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;

【讨论】:

  • timerView 属性是指将显示这些子视图中的每一个的主视图?
  • 在这个例子中,作为 nib 文件所有者的 UIViewController 应该有一个timerViewFromNib 属性(连接到 nib 文件中的 NSView)。
  • 是的,但是由于它是一个 NSView,是我的 nib 文件中的 NSView 将显示每个单独的视图,还是将这些单独的视图添加到的 NSView?
  • 是使用 CollectionView 还是继续这样做更好?
  • 每次实例化 nib 时,都会从 nib 取消归档新的计时器视图并分配给 timerViewFromNib 属性。您可以将此视图添加到视图控制器的视图中(示例中为self.view)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2015-05-25
  • 2012-11-16
  • 1970-01-01
  • 2022-08-04
相关资源
最近更新 更多