【发布时间】:2017-01-29 23:44:22
【问题描述】:
或者换句话说...如何将一个类的一个实例的动作委托给三个不同的视图控制器?在撰写本文时,我将一个类作为公共变量启动,使我的所有视图控制器都可以访问它以将自己设置为委托。但我不喜欢这种方法,因为它把我限制在类的一个实例上。
我的目标是创建一个类的实例,它能够将某些事情委托给三个视图控制器 - 而不会将其公开。我想使用类的原因是因为我希望能够启动 samme 类的更多实例,但如果它是 View Controller 类之外的硬编码公共变量,我不能这样做。
我会尽力解释这个问题。提前致谢!
1) 我有三个视图控制器和一个拆分视图控制器:
截图如下:
2) 我有一个名为“ConnectionHandler”的类。该类的目的是连接到 WebSocket,维护连接并在接收到特定数据包时执行某些操作。 ConnectionHandler 类也继承自另一个类“PacketHandler”。
3) ConnectionHandler 和 PacketHandler 都需要将某些事情委托给三个不同的视图控制器:主视图控制器,另一个包含 NSTextView 的视图控制器,最后一个包含 NSTableView 的视图控制器。
我将提供一些我的代码,我将从我的 ConnectionHandler 开始:
import Starscream
class ConnectionHandler: PacketHandler, WebSocketDelegate {
let ws = WebSocket(url: URL(string: "ws://localhost:8080")!)
func connect() {
ws.delegate = self
ws.connect()
}
func disconnect() {
ws.delegate = nil
ws.disconnect()
}
func websocketDidReceiveMessage(socket: WebSocket, text: String) {
}
func websocketDidConnect(socket: WebSocket) {
}
func websocketDidDisconnect(socket: WebSocket, error: NSError?) {
}
func websocketDidReceiveData(socket: WebSocket, data: Data) {
}
}
还有我的 PacketHandler 中的重要部分:
class PacketHandler {
var textViewDelegate: TextViewAppendDelegate?
func message(packet: String) {
// A message is detected, so I want to push this to a TextView
textViewDelegate?.appendTextView(str: packet)
}
}
协议:
protocol TextViewAppendDelegate {
func appendTextView(str: String)
}
还有 View Controller,ConnectionHandler/PacketHandler 将操作委托给:
class TextViewController: NSViewController, TextViewAppendDelegate {
@IBOutlet var textView: NSTextView!
func appendTextView(str: String) {
// Code to append a message to a NSTextView
}
override func viewDidLoad() {
super.viewDidLoad()
socket.textView = self
}
}
正如我所说,我只是将 ConnctionHandler 类作为公共变量启动,因为这是我知道如何委托给多个视图控制器的唯一方法。 如果我在主视图控制器中启动类,我发现自己无法委托给其他视图控制器。
我曾考虑将所有三个视图控制器链接到同一个视图控制器类,但我也不确定那个。我还考虑过从三个 View Controller 之一启动 ConnectionHandler,然后(以某种方式)在 View Controller 之间创建委托,使其他 View Controller 可以将自己设置为类的某些方面的委托。 我想我的想法是“视图控制器”需要了解(或访问)“类”的一个实例,才能将其“设置为自己”作为委托。还有其他更好的方法吗?
再次,非常感谢。
更新: 如果想使用单例,雅各布斯的回答可以工作。所以我给了他正确的答案。但经过更多挖掘后,我了解了 NotficationCenter,它适合我的需求!
【问题讨论】:
标签: swift macos delegates protocols viewcontroller