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

时间:2016-07-28 22:15:55

标签: swift macos cocoa delegation

在下面的代码中,(我希望)包含与我的问题相关的所有内容,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直接进行通信。不幸的是,我找不到关于代表团的任何解释足够接近这种情况 - 至少不是我能理解的。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来有两个问题。

在你的ChangerView类中,你应该使用委托设置show变量,如下所示:

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 var设置为ChangingView类的实例(这通常在viewDidLoad()函数中完成。

看起来像这样:

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

    override func viewDidLoad() {
        super.viewDidLoad()

        SomeChangerView.changerDelegate = SomeChangingView
}