【问题标题】:How to print data in empty array如何打印空数组中的数据
【发布时间】:2017-09-30 21:11:53
【问题描述】:

我正在尝试打印在表中声明为空全局变量的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)
}



}

【问题讨论】:

    标签: ios arrays uiviewcontroller swift4 xcode9


    【解决方案1】:

    假设您确定视图控制器要接收数据,问题将是:tableview 数据源方法在接收任何数据之前调用 ,这意味着 chat 数据源数组仍然是空的,因此没有要显示的数据。

    您的情况的解决方案是确保在接收数据后重新加载表视图(更新chat 数据源数组的值),这意味着在您的情况下,在将消息附加到@ 之后987654324@ 在messageReceived 方法中通过调用reloadData() UITableView 实例方法:

    func messageReceived(_ message: String) {
    
        chatMessage.text = message
        chat.append(message)
    
        // here we go:
        tableView.reloadData()
    }
    

    【讨论】:

      【解决方案2】:

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

      干杯!

      【讨论】:

      • 或者最好调用insertRows来添加新行;重新加载整个 tableview 是过度的
      【解决方案3】:

      你需要告诉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)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-10
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多