从已经初始化的其他类调用NSView

Gra*_*son 0 xcode cocoa initialization objective-c

如何调用已使用其他窗口初始化的NSView?

newContentView = [[CutoutView alloc]initWithFrame:window.frame]; //make a new CutoutView
    [window setContentView:newContentView]; //set it as the contentview of our window
    [newContentView release];
Run Code Online (Sandbox Code Playgroud)

newContentView是一个NSView子类,它被设置为我窗口的contentView.在NSView子类"CutoutView"中,我绘制了一个简单的rect.

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

Ver*_*ous 7

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

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

  • 如果你仍然有参考window,只需打电话[[window contentView] setNeedsDisplay:YES].
  • 使newContentView成为特定类的属性,以便您的其他类可以访问它...从根本上说,您必须了解类如何真正起作用才能回答您的问题,因为这不是技术问题,它是概念性的一.

所以第一个问题就是你认为你CutoutView代表了一个对象,就像你说的那样,"已经被初始化了".这是错误的思考方式.CutoutView是一个类,而不是一个实例.

你可能已经听过关于类和蓝图的比喻,所以我会使用稍微不同的东西.CutoutView是丰田普锐斯 - 不是汽车,而是模型,具有设计蓝图和制造工艺以及一切.在路上有成千上万的普锐斯,就像成千上万的实例一样CutoutView.

你的问题似乎暗示你认为CutoutView是一辆汽车,一辆坐在车道上的普锐斯的物理表现; 但它从根本上说不是.


是丰田普锐斯的模型,设计/品牌,甚至是尼米兹级航空母舰,它描述了一种类型的船(其中有10艘).这些课程本身并不重要.

一个对象,或实例一的,是你的计划与实际的事情.这就是代码中的newContentView.你只是告诉它,比喻:(我希望这是有道理的)

NimitzClassCarrier *USSGeorgeHWBush = [[NimitzClassCarrier constructBoat] prepareForLaunch];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

^美国乔治HW布什alloc在2009年完成了并且在init那年初被委托,编辑和交付给海军.

在此输入图像描述

^的USS尼米兹是一个的另一示例例如一个尼米兹类载体.

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


因此,

你不能告诉乔治HW布什号航空公司通过电话发射它的飞机

NimitzClassCarrier *aCarrier = [[NimitzCarrierClass construct] prepareForLaunch];
[aCarrier launchPlanes];
Run Code Online (Sandbox Code Playgroud)

考虑一下.你所做的就是花费数百万美元建造另一个你称之为"aCarrier"的载体(一个不那么适合航海的名字)并告诉它发射它的飞机.

相反,你想要做的是实际上引用美国乔治HW布什本身,以告诉它发射它的飞机.所以现在让我们回到你的CutoutView.您创建了一个实例CutoutView并将其发送到您的窗口进行显示.然后你基本上通过放弃引用来切断你和那个实例之间的直接无线电链接(因为我假设你再次与NewContentView没有任何关系.

幸运的是,窗口仍然与CutoutView您创建的实例具有直接的无线电通信链接.因此,我的第一个建议选项调用[[window contentView] setNeedsDisplay:YES],它告诉你具体的实例NSWindow得到它的contentView这恰好是在实例CutoutView要显示.

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

[顺便说一下,你到底如何与航空母舰沟通?我不认为它是无线电......在Objective-C中,它有一个指向载波/物体的存储器地址的指针,但船只完全是另一个世界.

或者,如果rdelmar在评论方式中询问,instance您希望能够与contentView进行通信的NSView实际上是contentView的子视图......好吧,想一想这样.第15艘救生艇希望能够告诉乔治HW布什号飞机发射它的飞机.怎么样?[[self parentBoat] launchPlanes].这转化为[[self superview (a.k.a. parentNSView)] setDisplayNeeded:YES].

另请参阅@Dmorneault关于您可以与您刚刚发送到百慕达三角形的尊敬航空母舰建立无线电通信的其他方式的答案.

问题是,建立一个新的contentView/boat并不能解决问题,这就是你要做的事情,这就是你遇到的问题.

我不认为我解释得很好,并且如果这对你来说并不陌生,我会道歉,但我认为你的问题表明了对课程如何运作的误解.我对航空母舰一无所知,但这是我在维基百科上遇到的第一件事.

有用的概念资源: