对不起我的无能,但我总是对Cocoa,Swift和面向对象编程不熟悉。我的主要资料来源是OS X的Cocoa Programming(第5版),以及Apple的行话和Objective-C-riddled Developer页面。但我在这里是因为我没有看到(或者没有意识到我所看到的)任何可以解决这个问题的事情。
我想在另一个IB创建的自定义视图RightView中通过mouseEntered / -Exited操作更改一个IB创建的自定义视图LeftView的内容。两者都在同一个窗口。我创建了一个玩具程序,试图解决问题,但无济于事。
这里是RightView的类定义(应该更改LeftView):
import Cocoa
class RightView: NSView {
override func drawRect(dirtyRect: NSRect) {
// Nothing here, for now.
}
override func viewDidMoveToWindow() {
window?.acceptsMouseMovedEvents = true
let options: NSTrackingAreaOptions =
[.MouseEnteredAndExited, .ActiveAlways, .InVisibleRect]
let trackingArea = NSTrackingArea(rect: NSRect(),
options: options,
owner: self,
userInfo: nil)
addTrackingArea(trackingArea)
}
override func mouseEntered(theEvent: NSEvent) {
Swift.print("Mouse entered!")
LeftView().showStuff(true)
}
override func mouseExited(theEvent: NSEvent) {
Swift.print("Mouse exited!")
LeftView().showStuff(false)
}
}
这里是LeftView的类定义(应该由RightView更改):
import Cocoa
class LeftView: NSView {
var value: Bool = false {
didSet {
needsDisplay = true
Swift.print("didSet happened and needsDisplay was \(needsDisplay)")
}
}
override func mouseUp(theEvent: NSEvent) {
showStuff(true)
}
override func drawRect(dirtyRect: NSRect) {
let backgroundColor = NSColor.blackColor()
backgroundColor.set()
NSBezierPath.fillRect(bounds)
Swift.print("drawRect was called when needsDisplay was \(needsDisplay)")
switch value {
case true: NSColor.greenColor().set()
case false: NSColor.redColor().set()
}
NSBezierPath.fillRect(NSRect(x: 40, y: 40,
width: bounds.width - 80, height: bounds.height - 80))
}
func showStuff(showing: Bool) {
Swift.print("Trying to show? \(showing)")
value = showing
}
}
我确定我错过了一些东西"完全明显,"但我有点密集。如果您能告诉我如何修复code / xib文件,我将非常感激。如果你能解释一些事情,比如与孩子交谈,我会更加感激。当我接管这个世界(我对所有事情都不称职)时,我会记住你的善意。
答案 0 :(得分:0)
我想出了一个比我之前的策略简单得多的解决方法。而不是在一个自定义视图中使用mouseEntered / -Exited操作尝试控制在另一个自定义视图中显示的内容,我只是将mouseEntered / -Exited代码放入我想要控制的视图中,然后我更改了{{{ 1}} rect:
。
在针对该方法移动代码之前,我尝试将NSTrackingArea
中的owner:
更改为NSTrackingArea
,然后移动mouseEntered / -Exited代码。这产生了许多可怕的错误信息(天真的新手在这里说话),所以我放弃了它。不过,如果能够正确分配LeftView()
以外的所有者,那将会很高兴。
无论如何,任何进一步的想法或见解都将不胜感激。