ios - 红蜘蛛委托(delegate)未被召集

标签 ios swift sockets delegates

变量不是 nil,我的连接很好,url 是正确的,但没有调用委托(delegate)方法。我也在实现 WebSocketDelegate

 let socket = WebSocket(url: NSURL(string: "UrlHere:port/")!)
            socket.delegate = self;
            socket.connect()
            if socket.isConnected {
                print("websocket is connected")
            }

    func websocketDidConnect(ws: WebSocket) {
        print("websocket is connected")
    }

    func websocketDidDisconnect(ws: WebSocket, error: NSError?) {
        if let e = error {
            print("websocket is disconnected: \(e.localizedDescription)")
        } else {
            print("websocket disconnected")
        }
    }

    func websocketDidReceiveMessage(ws: WebSocket, text: String) {
        print("Received text: \(text)")
    }

    func websocketDidReceiveData(ws: WebSocket, data: NSData) {
        print("Received data: \(data.length)")
    }

    func websocketDidReceivePong(socket: WebSocket) {
        print("Got pong!")
    }

最佳答案

Socket 应该是你的类的一个属性或变量,以确保它存在。

如果你只在一个函数栈上分配它,它将超出范围,委托(delegate)将永远不会被调用

这是我在项目中使用的代码,以防万一

import UIKit
//import WebSocket
import Starscream

class ViewController: UIViewController,WebSocketDelegate,WebSocketPongDelegate {

    @IBOutlet weak var wsURL: UITextField!

    @IBOutlet weak var wsConsole: UITextView!

    @IBOutlet weak var wsMessage: UITextField!

    var socket:WebSocket!

    override func viewDidLoad() {
        super.viewDidLoad()

//        var webSocketObj:WebSocket = WebSocket()
//        webSocketObj.ipAddressText = "10.12.1.101"
//        webSocketObj.portText = "8888"
//        webSocketObj.dataToSendText = "hi"
//        webSocketObj.dataRecievedTextView = ""
//        webSocketObj.connectedLabel = ""
//        webSocketObj.connectToServer()


        wsURL.text="ws://10.12.1.101:8888/"
        wsMessage.text="Hi"
        self.navigationItem.leftBarButtonItem?.title="Connect"
        self.navigationItem.rightBarButtonItem?.enabled=false
        // Do any additional setup after loading the view, typically from a nib.
    }

    func websocketDidConnect(socket: WebSocket){
     wsConsole.text = wsConsole.text .stringByAppendingString("\n websocket got connected")
         self.navigationItem.leftBarButtonItem?.title="Disconnect"
        self.navigationItem.rightBarButtonItem?.enabled=true
    }

    func websocketDidDisconnect(socket: WebSocket, error: NSError?){
    wsConsole.text = wsConsole.text .stringByAppendingString("\n websocket got disconnected")
     self.navigationItem.leftBarButtonItem?.title="Connect"
     self.navigationItem.rightBarButtonItem?.enabled=false
    }

    func websocketDidReceiveMessage(socket: WebSocket, text: String){
     wsConsole.text = wsConsole.text .stringByAppendingString("\n websocket got a message from server:").stringByAppendingString(text)
    }

    func websocketDidReceiveData(socket: WebSocket, data: NSData){
        print("websocket received data",data)
    }

    @IBAction func writeText(sender: UIBarButtonItem) {
        wsConsole.text = wsConsole.text .stringByAppendingString("\n Client sent a message:").stringByAppendingString(wsMessage.text!)
        socket.writeString(wsMessage.text!)
        self.view .endEditing(true)
    }

    @IBAction func disconnect(sender: UIBarButtonItem) {
         self.view .endEditing(true)
        if socket == nil{
            connect(sender)
        }
        else if socket.isConnected {
            socket.disconnect()
        } else {
            connect(sender)
        }
    }

    func connect(sender:UIBarButtonItem){
        socket = WebSocket(url: NSURL(string:wsURL.text!)!)
        socket.delegate = self
        socket.connect()
    }

    func websocketDidReceivePong(socket: WebSocket){
        wsConsole.text = wsConsole.text .stringByAppendingString("\n websocket received pong")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

这是 link Storyboard以防万一

关于ios - 红蜘蛛委托(delegate)未被召集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37059896/

相关文章:

swift - 在 TableView 中居中标签和 UITextField

php - 从 PHP 向 Python 脚本发送数据

ios - 在 objc 类中使用 nib 名称初始化 swift View Controller

ios - Swift - 执行 Segue 时的 fatal error

ios - 无法从 Facebook 获取照片

ios - 如何等待具有不同负载的多个 PromiseKit promise ?

java - 安卓编译器: Cannot resolve symbol string

sockets - 为什么非阻塞 TCP 套接字会在::write() 调用中花费大量时间?

ios - CABasicAnimation 动画(寻找)到整个时间轴上的时间位置

iphone - Xcode:如何在 IOS5 Storyboard中添加新的选项卡屏幕?