我一直在尝试制作一个基本的 swift 4 应用程序,它连接到我的节点服务器并运行我为该应用程序的网络版本准备的事件。使用下面的代码,它可以顺利地无缝连接到服务器,但另一方面,我显然不能在这个闭包之外发送到套接字,因为套接字是用 viewDidLoad()
定义的。
如果我试图将 socket 声明移到这个函数之外,它会给我这个错误:
"Cannot use instance member 'manager' within property initializer; property initializers run before 'self' is available".
我尝试查看许多不同的文档,但都没有成功。
@IBOutlet weak var messagesBody: UITextView!
@IBOutlet weak var newMessageInput: UITextField!
@IBOutlet weak var newMessageSubmit: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
let manager = SocketManager(socketURL: URL(string: "http://localhost:3000/chat.html?name=developer&room=test")!, config: [.log(true), .compress])
let socket = manager.defaultSocket
socket.connect()
newMessageSubmit.addTarget(self, action: #selector(sendNewMessage), for: .touchUpInside)
}
@objc func sendNewMessage() {
let newMessageContent = newMessageInput.text!
print("Sending message..." + newMessageContent)
// socket.emit("createMessage", newMessageContent)
// right here ^^^^^
}
最佳答案
首先,正如错误所说,你不能在 viewDidLoad
之外使用管理器实例属性来启动套接字,如果你想在任何方法中访问一个变量,你必须将它声明为全局,这样它的范围是整个类(class)。此代码使用 socket
变量:
var socket:SocketIOClient!
override func viewDidLoad() {
super.viewDidLoad()
let manager = SocketManager(socketURL: URL(string: "http://localhost:3000/chat.html?name=developer&room=test")!, config: [.log(true), .compress])
self.socket = manager.defaultSocket
self.socket.connect()
newMessageSubmit.addTarget(self, action: #selector(sendNewMessage), for: .touchUpInside)
}
@objc func sendNewMessage() {
let newMessageContent = newMessageInput.text!
print("Sending message..." + newMessageContent)
self.socket.emit("createMessage", newMessageContent)
}
关于ios - 如何制作一个基本的 swift 4 套接字 io 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48671914/