0

如何调用已经用另一个窗口初始化的 NSView?

newContentView = [[CutoutView alloc]initWithFrame:window.frame]; //make a new CutoutView
    [window setContentView:newContentView]; //set it as the contentview of our window
    [newContentView release];

newContentView 是一个 NSView 子类,它被设置为我的窗口的 contentView。在 NSView 子类“CutoutView”中,我让它绘制了一个简单的矩形。

在另一个 NSView 子类中,我希望能够告诉 newContentView 或只是 CutoutView 它需要重绘,[setNeedsDisplay:YES]但我能想到的唯一方法是制作另一个[[CutoutView alloc] init];,当我这样做并且调用 set 需要显示没有任何效果时。它说它正在执行它,但是它没有显示可能是因为 CutOutView 已经初始化。我怎样才能访问 newContentView 或只是从它已经初始化的地方访问 CutoutView 以便它实际显示。谢谢!

4

2 回答 2

7

因此,首先,您需要获取对CutoutView您创建的特定实例的引用,以便您可以告诉该特定实例重新显示自身。

您可以通过以下几种方式执行此操作:

  • 如果您仍有参考window,只需调用[[window contentView] setNeedsDisplay:YES].
  • 使 newContentView 成为特定类的属性,以便您的其他类可以访问它...从根本上讲,您必须了解类的实际工作方式才能回答您的问题,因为这不是技术问题,而是概念性的一。

所以第一个问题是你认为你的CutoutView代表一个对象,正如你所说的,“已经被初始化了”。这是错误的思考方式。CutoutView是一个类,而不是一个实例。

你可能已经听说过关于类和蓝图的比喻,所以我将使用稍微不同的东西。CutoutView是丰田普锐斯——不是汽车,而是模型,有设计蓝图和制造过程等等。路上有成千上万的普锐斯,同样的方式可能有成千上万的CutoutView.

您的问题似乎暗示您认为CutoutView这是一辆汽车,是一辆普锐斯坐在车道上的物理表现;但它基本上不是。


一个是一个模型,丰田普锐斯的设计/品牌,甚至是尼米兹级航空母舰,它描述了一种船(其中有 10 艘)。这些课程本身并没有多大意义。

对象或类的实例是您程序使用的实际事物。这就是代码中的newContentView。您只是比喻性地告诉了它:(我希望这是有道理的)

NimitzClassCarrier *USSGeorgeHWBush = [[NimitzClassCarrier constructBoat] prepareForLaunch];

在此处输入图像描述

^ 乔治·H·W·布什号航空母舰于 2009 年完工,并于当年年初alloc被委托、编辑并交付给海军。init

在此处输入图像描述

^尼米兹号航空母舰是尼米兹级航母的另一个例子

您已经创建了该类的一个实例CutoutView因此您可以实际使用它。您可以创建同一类的多个实例/对象;毕竟有 10 艘尼米兹级航母。


因此

你不能通过打电话告诉 USS George HW Bush 发射它的飞机

NimitzClassCarrier *aCarrier = [[NimitzCarrierClass construct] prepareForLaunch];
[aCarrier launchPlanes];

考虑一下。你所做的只是花费数百万建造另一艘你称为“aCarrier”(一个不太适合航海的名字)的航母,并告诉它发射它的飞机。

相反,您想要做的是实际获得对乔治·H·W·布什号航空母舰本身的参考,以告诉它发射飞机。所以现在让我们回到你的CutoutView. 您创建了一个实例CutoutView并将其发送到您的窗口进行显示。然后,您基本上通过放开引用来切断您与该实例之间的直接无线电链接(因为我假设您再次与 NewContentView 无关。

CutoutView幸运的是,该窗口仍然与您创建的实例有直接的无线电通信链接。因此,我建议的第一个选项是 call [[window contentView] setNeedsDisplay:YES],它告诉您的特定实例获取NSWindowcontentView恰好是您要显示的实例。CutoutView

毕竟,你可以做你想做的事情的方法是无穷无尽的。您可以保持与您的航空母舰的直接无线电通信链接,并将该通信方式提供给您希望能够发送航空母舰消息的其他 NSView 实例。您可以切断与 的所有直接通信contentView并让窗口处理这一切,告诉 NSView 的另一个实例向窗口询问无线电线路。

[顺便说一句,你到底是怎么和航空母舰沟通的?我不认为它是无线电......在Objective-C中它有一个指向载体/对象的内存地址的指针,但船完全是另一个世界。]

或者,如果按照上面rdelmar的评论方式询问,instance您希望能够与 contentView 通信的 NSView 实际上是 contentView 的子视图......好吧,这样想吧。第 15 艘救生艇希望能够告诉乔治·H·W·布什号航空母舰发射它的飞机。如何?[[self parentBoat] launchPlanes]. 这转化为[[self superview (a.k.a. parentNSView)] setDisplayNeeded:YES].

另请参阅@Dmorneault 的回答,了解您可以与您刚刚发送到百慕大三角地区的受人尊敬的航空母舰建立无线电通信的其他方式。

问题是,构建一个新的contentView/boat并不能解决问题,这就是你想要做的,这就是你遇到的问题。

我认为我解释得不是很好,如果这对您来说不是新事物,我深表歉意,但我认为您的问题表明对课程的运作方式存在误解。我对航空母舰也一无所知,但这是我在维基百科上遇到的第一件事。

有用的概念资源:

于 2012-04-15T04:23:45.680 回答
0

我不完全确定您的代码是如何设置的,但您应该使用属性来引用对象。将以下内容添加到您的 .h 文件中

@property (nonatomic, strong) CutoutView * newContentView;

现在在您的 .m 文件中,您可以通过添加使用 self.newContentView 访问对象

@synthesize newContentView = _newContentView;
newContentView = [[CutoutView alloc]initWithFrame:window.frame]; //make a new CutoutView
self.newContentView = newContentView;
[window setContentView:self.newContentView]; //set it as the contentview of our window
[newContentView release];
于 2012-04-15T04:20:27.793 回答