我一直在尝试创建一个连接到我的节点服务器的基本swift 4应用程序,并运行我为此应用程序的Web版本提供的事件。使用下面的代码,它可以毫无障碍地无缝连接到服务器,但另一方面,我显然不会向此闭包外部的套接字发出,因为套接字是使用viewDidLoad()
定义的。
如果我尝试在这个函数之外移动套接字声明,它会给我这个错误:
“无法在属性初始化程序中使用实例成员'manager';属性初始化程序在'self'可用之前运行”。
我试图查看许多不同的文档,但没有成功。
@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 ^^^^^
}
答案 0 :(得分:0)
首先,正如错误所说,你不能使用viewDidLoad
之外的管理器实例属性来启动套接字,如果你想在任何方法中访问变量,你必须将它声明为全局,所以它的范围是整个类。此代码使用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)
}