委派:如何在自定义视图之间传递 属性
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
}
在下面的代码中(我希望)包含与我的问题相关的所有内容,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
}