【问题标题】:how to make a basic swift 4 socket io app如何制作一个基本的 swift 4 socket io 应用程序
【发布时间】:2018-02-07 19:36:13
【问题描述】:

我一直在尝试制作一个基本的 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 ^^^^^
}

【问题讨论】:

    标签: ios swift socket.io


    【解决方案1】:

    首先,正如错误所说,你不能使用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)
    
    }
    

    【讨论】:

    • 如果答案解释问题和解决方案,而不是仅发布代码转储,则答案会更有帮助(对问题的作者和未来的读者都是如此)。
    • @Sh_Khan 在 self.socket 的每个引用中都说:可选类型“SocketIOClient”的值?未拆封;你的意思是用'!'还是“?”?
    • 转换为 var socket:SocketIOClient!
    猜你喜欢
    • 2016-01-06
    • 2020-08-12
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多