如何在另一个IB自定义视图中使用mouseEntered / -Exited控制一个IB自定义视图

时间:2016-07-19 00:36:34

标签: swift macos cocoa interface-builder nsview

对不起我的无能,但我总是对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文件,我将非常感激。如果你能解释一些事情,比如与孩子交谈,我会更加感激。当我接管这个世界(我对所有事情都不称职)时,我会记住你的善意。

1 个答案:

答案 0 :(得分:0)

我想出了一个比我之前的策略简单得多的解决方法。而不是在一个自定义视图中使用mouseEntered / -Exited操作尝试控制在另一个自定义视图中显示的内容,我只是将mouseEntered / -Exited代码放入我想要控制的视图中,然后我更改了{{{ 1}} rect:

在针对该方法移动代码之前,我尝试将NSTrackingArea中的owner:更改为NSTrackingArea,然后移动mouseEntered / -Exited代码。这产生了许多可怕的错误信息(天真的新手在这里说话),所以我放弃了它。不过,如果能够正确分配LeftView()以外的所有者,那将会很高兴。

无论如何,任何进一步的想法或见解都将不胜感激。