在下面的代码中,(我希望)包含与我的问题相关的所有内容,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直接进行通信。不幸的是,我找不到关于代表团的任何解释足够接近这种情况 - 至少不是我能理解的。
我缺少什么(除了功能正常的大脑)?
谢谢!
答案 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
}