ios - 如何制作一个基本的 swift 4 套接字 io 应用程序

标签 ios swift socket.io

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

相关文章:

iOS - 在输入过程中验证用户 ip 地址

ios - OKta + react native + OKta 自定义登录页面 + okta 离线登录

ios - 无法从主 UIViewController 访问嵌入式 UICollectionView

ios - 在 TableView Controller 上添加后退按钮

node.js - 自定义 node-red-node socket.io 客户端建立连接但在接收数据时崩溃?

node.js - 如何解决 Socket.io 404(未找到)错误?

ios - iOS 内存对齐错误

ios - 使用 Swift 解包 Yahoo API

ios - 如何快速验证电子邮件地址?

node.js - 客户端未通过 IIS Node 从 SocketIO 接收事件