如何调用已经用另一个窗口初始化的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];,并且当我这样做并调用集需要时显示无用。它说正在执行此操作,但是可能由于CutOutView已经初始化的事实而没有显示。如何从已初始化的位置访问newContentView或只是CutoutView,以使其实际显示。谢谢!

最佳答案

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

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


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




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

您可能已经听说过有关类和蓝图的隐喻,所以我将使用略有不同的内容。 CutoutView是丰田普锐斯(Prius)-不是汽车,而是模型,具有设计蓝图,制造过程和所有内容。路上有成千上万的Priuse,同样,有成千上万的CutoutView实例。

您的问题似乎暗示您以为CutoutView是汽车,是Prius坐在车道上的物理表现。但从根本上来说不是。



一个类别是一个模型,是丰田普锐斯的设计/品牌,甚至是Nimitz class aircraft carrier,它描述了一艘船(其中有10艘)。就课程本身而言,意义不大。

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

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




^美国海军乔治H.W.布什在2009年完成了“ alloc”任务,并于当年初被委托,调试并交付给海军。



^尼米兹号航空母舰是尼米兹级载具的另一个实例。

您已经创建了init类的实例,因此您可以实际使用它。您可以创建同一类的多个实例/对象。毕竟有10架Nimitz航母。



因此,

你不能告诉美国海军乔治·H.W。布什呼吁通过发射飞机

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


考虑一下。您所要做的就是花费数百万美元建造另一艘您称为“ aCarrier”(航海性更差的名称)的航母,并告诉它发射飞机。

相反,您要做的实际上是参考美国海军乔治H.W.布什本人告诉它发射飞机。现在,让我们回到您的CutoutView。您创建了CutoutView的实例,并将其发送到窗口进行显示。然后,您基本上通过放开引用来断开您与该实例之间的直接无线电链接(因为我假设您不再与NewContentView无关。

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

毕竟,您可以做自己想做的事情的方法有很多。您可以保持与航空母舰的直接无线电通信链接,并将该通信方式传递给您希望能够发送航空母舰消息的另一个NSView实例。您可以切断与contentView的所有直接通信,然后让窗口处理所有事情,告诉另一个NSView实例向窗口询问无线线路。

[顺便说一句,您到底如何与航空母舰通信?我不认为这是无线电。在Objective-C中,它具有指向载体/对象的内存地址的指针,但是船完全是另一个世界。

或者,如果按照评论中的方式rdelmar询问,您希望能够与contentView进行通信的NSView的instance实际上是contentView的子视图...那么,可以这样考虑。第15艘救生艇希望能够告诉美国海军乔治·布什总统发射飞机。怎么样? [[self parentBoat] launchPlanes]。这将转换为[[self superview (a.k.a. parentNSView)] setDisplayNeeded:YES]

另请参阅@Dmorneault有关您可以与刚刚送入百慕达三角洲的尊贵航空母舰建立无线电通信的其他方式的答案。

问题是,构建新的contentView/boat并不能解决问题,这就是您要尝试的工作,而这就是您遇到的问题。

我认为我的讲解不太好,如果这对您并不陌生,请您道歉,但我认为您的问题表明对班级的工作方式有误解。我也对航空母舰一无所知,但这是我在Wikipedia上遇到的第一件事。

有用的概念资源:


Oracle/Java conceptual docs
Apple Docs

10-08 05:32