swift - 如何使用鼠标在另一个 IB 自定义 View 中进入/退出来控制一个 IB 自定义 View

标签 swift macos cocoa interface-builder nsview

对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满行话和 Objective-C 的开发者页面。但我来这里是因为我还没有看到(或者没有意识到我看到)任何与这个问题有关的东西。

我想通过另一个 IB 创建的自定义 View RightView 中的鼠标输入/退出操作来更改一个 IB 创建的自定义 View 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 文件,我将非常感激。如果您能解释一下与 child 交谈时的情况,我会更加感激。当我接管这个世界时(我并非事事无能),我会记住你的恩情。

最佳答案

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

在通过这种方法移动代码之前,我尝试将 owner: 中的 NSTrackingArea 更改为 LeftView(),然后仅移动 mouseEntered/-Exited 代码。这产生了很多可怕的错误消息(天真的新手在这里说话),所以我放弃了它。不过,如果知道如何正确分配 self 以外的所有者,那就太好了。

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

关于swift - 如何使用鼠标在另一个 IB 自定义 View 中进入/退出来控制一个 IB 自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447885/

相关文章:

swift - 从 Swift 函数获取通用类型 UIView

ios - 基于Web服务实现快速更新行标签

python - opencv python 操作系统

objective-c - 当考虑 Objective-C 中的 "Library"时,我必须想象什么?

objective-c - Cocoa 以编程方式绑定(bind)+不更新值?

ios - 如何将 CBDescriptor 值转换为字符串?

xcode - 当动画从两个容器子 UIViews 过渡时,UIViews 在第三次过渡后为空,这是怎么回事?

swift - macos CLLocationManager 提示

xcode - 在Xcode中调试时如何显示我的程序的所有线程

objective-c - 如何确定 Apple 方法是否异步?