簡體   English   中英

如何打印空數組中的數據

[英]How to print data in empty array

我正在嘗試打印在表中聲明為空全局變量的chat數組。 我嘗試打印的數據是使用網絡套接字接收的。 我在messageReceived函數中分配數據,我知道數據正在進入程序,因為我正在標簽中打印,但是當我試圖在表中打印它時很簡單,不起作用。 所有這些都在ViewController.swift

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)
}



}

假設你確定你的視圖控制器有數據要接收,問題是:tableview數據源方法接收任何數據之前被調用,這意味着chat數據源數組仍然是空的,因此沒有數據展示。

您的情況的解決方案是確保接收數據重新加載 tableview(更新chat數據源數組的值),這意味着在您的情況下,通過調用reloadData() UITableView 實例方法在messageReceived方法中將消息附加到chat后:

func messageReceived(_ message: String) {

    chatMessage.text = message
    chat.append(message)

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

在您收到的消息處理程序中,發出 tableview.reloadData()

干杯!

你需要告訴tableview有新數據。 您還需要考慮到網絡操作可能發生在后台隊列和 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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM