2017-09-30 9 views
1

空のグローバル変数としてテーブルに宣言されたchat配列を出力しようとしています。印刷しようとしているデータは、Webソケットを使用して受信されます。 messageReceived関数でデータを割り当てていますが、ラベルに印刷しているのでデータがプログラムに到達していることがわかりましたが、テーブルに印刷しようとしている瞬間は簡単ではありません。このすべてがViewController.swiftである:空の配列にデータを印刷する方法

あなたのメッセージ受信ハンドラ、問題tableview.reloadData(で
import UIKit 
import Starscream 

var messagetext: String = "" 

var tabletext: String = "" 

var chat = [String]() 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { 

var socket = WebSocket(url: URL(string: "ws://localhost:1337/")!, protocols: ["chat"]) 

@IBOutlet weak var chatMessage: UILabel! 
@IBOutlet weak var textField: UITextField! 
@IBOutlet weak var tableView: UITableView! 

@IBAction func buttonClick(_ sender: Any) { 
    messagetext = textField.text! 
    sendMessage(messagetext) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.textField.delegate = self 
    socket.delegate = self 
    socket.connect() 
    navigationItem.hidesBackButton = true 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.view.endEditing(true) 
} 

func textFieldDidEndEditing(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder() 
    return (true) 
} 

deinit{ 
    socket.disconnect(forceTimeout: 0) 
    socket.delegate = nil 
} 
} 


// MARK: - FilePrivate 
fileprivate extension ViewController { 

func sendMessage(_ messager: String) { 

    socket.write(string: messager) 
} 

func messageReceived(_ message: String) { 

    chatMessage.text = message 
    chat.append(message) 
} 
} 

// MARK: - WebSocketDelegate 
extension ViewController : WebSocketDelegate { 
public func websocketDidConnect(_ socket: Starscream.WebSocket) { 

} 

public func websocketDidDisconnect(_ socket: Starscream.WebSocket, error: NSError?) { 
    performSegue(withIdentifier: "websocketDisconnected", sender: self) 
} 

public func websocketDidReceiveMessage(_ socket: Starscream.WebSocket, text: String) { 
    // 1 
    guard let data = text.data(using: .utf16), 
     let jsonData = try? JSONSerialization.jsonObject(with: data), 
     let jsonDict = jsonData as? [String: Any], 
     let messageType = jsonDict["type"] as? String else { 
      return 
    } 

    // 2 
    if messageType == "message", 
     let messageData = jsonDict["data"] as? [String: Any], 

     let messageText = messageData["text"] as? String { 

     messageReceived(messageText) 


    } 
} 

public func websocketDidReceiveData(_ socket: Starscream.WebSocket, data: Data) { 

} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return(chat.count) 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell") 
    cell.textLabel?.text = chat[indexPath.row] as! String 

    return(cell) 
} 



} 

答えて

1

あなたのビューコントローラが受信するデータがあるについて確信していると仮定すると、問題は次のようになります。テーブルビューのデータソースメソッドはと呼ばれchatデータソース配列が空のままであることを意味し、任意のデータを、受信前に、したがって、表示するデータはありません。

あなたのケースのためのソリューションは、データを受信reloadData()を呼び出すことにより、messageReceived方法でchatにメッセージを付加した後、あなたの場合には意味、(chatデータソース配列の値を更新)後にテーブルビューをリロードすることを確認することですUITableViewインスタンスメソッド:

func messageReceived(_ message: String) { 

    chatMessage.text = message 
    chat.append(message) 

    // here we go: 
    tableView.reloadData() 
} 
0

乾杯!

+1

、または好ましくは、単に新しい行を追加するために 'insertRows'を呼び出します。テーブルビュー全体をリロードするのは過度です – Paulw11

0

新しいデータがあることをテーブルビューに伝える必要があります。また、ネットワーク操作は、おそらくバックグラウンドキュー上で発生し、UIの更新がメインキュー上になければならないという事実のためにできるようにする必要があります。

func messageReceived(_ message: String) { 

    DispatchQueue.main.async { 
     let newRow = IndexPath(row: chat.count, section:0) 
     chatMessage.text = message 
     chat.append(message) 
     tableView.insertRows(at:[newRow],with: .automatic) 
    } 
} 
関連する問題