【问题标题】:How to control one IB custom view with mouseEntered/-Exited in another IB custom view如何在另一个 IB 自定义视图中使用 mouseEntered/-Exited 控制一个 IB 自定义视图
【发布时间】:2016-07-19 00:36:33
【问题描述】:

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

我想在另一个 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
    }
}

我确定我遗漏了一些“非常明显”的东西,但我有点密集。如果您能告诉我如何修复代码/xib 文件,我将不胜感激。如果你能解释像和孩子说话时这样的事情,我会更加感激。当我接管世界时(我并非无所不能),我会记住你的好意。

【问题讨论】:

    标签: swift macos cocoa interface-builder nsview


    【解决方案1】:

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

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

    在任何情况下,任何进一步的想法或见解都将不胜感激。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多