如何调用已使用其他窗口初始化的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子类中,我希望能够通过[setNeedsDisplay:YES]
告诉newContentView或者只需要CutoutView它需要重新绘制,但我能想到这样做的唯一方法就是创建另一个[[CutoutView alloc] init];
我这样做并且调用set需要显示无效。它说它正在这样做,但它可能没有显示,因为CutOutView已经初始化。如何从已经初始化的位置访问newContentView或CutoutView,以便它实际显示。谢谢!
答案 0 :(得分:7)
首先,您需要获得对您创建的CutoutView
的特定实例的引用,以便您可以告诉该特定实例重新显示自己。
您可以通过以下几种方式执行此操作:
window
,请致电[[window contentView] setNeedsDisplay:YES]
。所以第一个问题是你认为你的CutoutView
代表一个对象,就像你说的那样,“已经被初始化了。”这是错误的思考方式。 CutoutView
是一个类,而不是实例。
你可能已经听过关于类和蓝图的比喻,所以我会使用稍微不同的东西。 CutoutView
是丰田普锐斯 - 不是汽车,而是模型,具有设计蓝图和制造工艺以及一切。在路上有成千上万的普锐斯,就像成千上万的{{1}}个实例一样。
你的问题似乎暗示你认为CutoutView
是一辆汽车,是坐在车道上的普锐斯的物理表现;但它从根本上说不是。
类是一个模型,丰田普锐斯的设计/品牌,甚至是Nimitz class aircraft carrier,它描述了一种船型(其中有10艘)。 类本身并不重要。
对象或类的实例是您的程序使用的实际内容。这就是代码中的 newContentView 。你刚才告诉它,比喻:(我希望这是有道理的)
CutoutView
^乔治H.W.布什在2009年完成了“NimitzClassCarrier *USSGeorgeHWBush = [[NimitzClassCarrier constructBoat] prepareForLaunch];
”并被委任,alloc
,并于当年年初交付给海军。
^ USS Nimitz 是Nimitz Class Carrier的实例的另一个例子。
您已经创建了init
类的实例,因此您可以实际使用它。您可以创建同一个类的多个实例/对象;毕竟,有10个尼米兹级运营商。
<强>因此强>,
你不能告诉乔治H.W.布什通过致电
发射飞机CutoutView
想一想。你所做的只是花费数百万美元建造另一个你称之为“aCarrier”(一个不那么适合航海的名字)的载体并告诉它发射它的飞机。
相反,您要做的是向USS George H.W实际获取参考。布什本身要告诉它发射飞机。现在让我们回到你的NimitzClassCarrier *aCarrier = [[NimitzCarrierClass construct] prepareForLaunch];
[aCarrier launchPlanes];
。您创建了CutoutView
的实例并将其发送到您的窗口以供显示。然后你基本上通过放开引用来切断你和那个实例之间的直接无线电链接(因为我假设你再次与NewContentView无关。
幸运的是,窗口仍然与您创建的CutoutView
实例有直接的无线电通信链接。因此,我的第一个建议选项是调用CutoutView
,它会告诉[[window contentView] setNeedsDisplay:YES]
的特定实例获取恰好是实例的NSWindow
您希望显示的contentView
。
毕竟,你可以做你想做的事情的方式是无止境的。您可以保持与航空母舰的直接无线电通信链接,并将该通信方式提供给您希望能够发送航空母舰消息的NSView的另一个实例。您可以切断与CutoutView
的所有直接通信,让窗口处理所有内容,告诉NSView的另一个实例向窗口询问无线电线路。
[顺便说一下,你到底如何与航空母舰沟通?我不认为它是无线电......在Objective-C中,它有一个指向载波/物体的存储器地址的指针,但船只完全是另一个世界。]
或者,如果在评论方式中询问contentView
,那么您希望能够与contentView通信的NSView rdelmar
实际上是contentView的子视图......好吧,这样想吧。第15艘救生艇希望能够告诉乔治HW布什号飞机发射它的飞机。怎么样? instance
。这转化为[[self parentBoat] launchPlanes]
。
另请参阅@Dmorneault关于您可以与您刚刚发送到百慕达三角形的尊敬的航空母舰建立无线电通信的其他方式的答案。
问题是,构建一个新的[[self superview (a.k.a. parentNSView)] setDisplayNeeded:YES]
并不能解决问题,这就是你要做的事情,而这正是你遇到的问题。
我不认为我解释得很好,如果这对你来说并不陌生,我会道歉,但我认为你的问题表明了对课程如何运作的误解。我对航空母舰一无所知,但这是我在维基百科上遇到的第一件事。
有用的概念资源:
答案 1 :(得分: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];