委派:如何在自定义视图之间传递 属性

Delegation: How to Pass a Property Between Custom Views

在下面的代码中(我希望)包含与我的问题相关的所有内容,ChangerView 中的 mouseEntered/-Exited 事件应该会更改 ChangingView 中的显示。 (ChangerView 和 ChangingView 并排显示并共享一个视图控制器。)但是,作为 OOP 新手,我严重遗漏了一些关于如何在这些视图之间设置委托的信息。这是 ChangerView(其中 DoThis?.show = nil,尽管我认为我将其设置为 true 或 false):

import Cocoa

protocol DoThis { var show: Bool { get set } }

class ChangerView: NSView {

    var changeDelegate: DoThis?

    // Set up for mouseEntered/-Exited
    override func mouseEntered(theEvent: NSEvent) { DoThis?.show = true }
    override func mouseExited(theEvent: NSEvent) { DoThis?.show = false }
}

下面是更改视图:

import Cocoa

class ChangingView: NSView, DoThis {

    var show: Bool = false { didSet { needsDisplay = true } }

    // Draw into the view
    override func drawRect(dirtyRect: NSRect) {

        switch show {
        case true:  // Display setup contingent on show = true
        case false: // Display setup contingent on show = false
        }
        // Draw contingent display
    }
}

据我了解,视图应该完成自己的基本显示工作,而视图控制器应该处理与模型相关的和更高级别的显示更改。因此,为了简单起见,我希望 ChangerView 和 ChangingView 直接通信。不幸的是,我找不到任何与这种情况足够接近的关于委派的解释——至少我无法理解。

我还缺少什么(除了功能正常的大脑)?

谢谢!

看来有两个问题。

在您的 ChangerView class 中,您应该使用委托来设置显示变量,如下所示:

import Cocoa

protocol DoThis { var show: Bool { get set } }

class ChangerView: NSView {

    var changeDelegate: DoThis?

    // Set up for mouseEntered/-Exited
    override func mouseEntered(theEvent: NSEvent) { changeDelegate?.show = true }
    override func mouseExited(theEvent: NSEvent) { changeDelegate?.show = false }
}

您可能希望使委托变量变弱以防止引用循环

另一个问题是您忘记了分配委托的步骤。我(我想其他人)经常忘记这一点。一旦您习惯了设置委托,您就会记得检查它是否一开始不起作用。

所以在某些时候你需要将 changeDelegate 变量设置为 ChangingView class 的 实例 (这通常是这样做的在 viewDidLoad() 函数中。

它将看起来像这样:

class SomeViewController: UIViewController {
    @IBOutlet weak var SomeChangerView: ChangerView!
    @IBOutlet weak var SomeChangingView: ChangingView!

    override func viewDidLoad() {
        super.viewDidLoad()

        SomeChangerView.changerDelegate = SomeChangingView
}