2017-09-30 3 views
1

Ich versuche, das Array chat zu drucken, das in einer Tabelle als leere globale Variable deklariert ist. Die Daten, die ich zu drucken versuche, werden über Web-Sockets empfangen. Ich ordne die Daten in der messageReceived Funktion zu, und ich weiß, dass die Daten zum Programm gelangen, weil ich in einem Etikett drucke, aber der Moment, in dem ich versuche, es in der Tabelle zu drucken, funktioniert einfach nicht. All dies ist in der ViewController.swift:So drucken Sie Daten im leeren Array

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



} 

Antwort

1

Unter der Annahme, dass Sie sicher sind, da Daten von Ihrem View-Controller empfangen werden, die Frage wäre: Die Tableview Datenquelle Methoden vor empfangen alle Daten genannt werden, was bedeutet, chat Datenquellen-Array noch leer ist, Daher sind keine Daten zur Anzeige verfügbar.

Die Lösung für den Fall ist, die tableview nach Empfangen von Daten (die Aktualisierung des Wertes von chat Datenquellen-Array), das heißt, im Fall erneut zu laden, nachdem eine Mitteilung an chat in messageReceived Verfahren Anfügen durch Aufruf reloadData(), um sicherzustellen, UITableView-Instanzmethode:

0

In Ihrer Nachricht ein tableview.reloadData()

Prost Handler Ausgabe erhalten!

+1

Oder rufen Sie vorzugsweise 'insertRows' auf, um einfach die neue Zeile hinzuzufügen; das Nachladen der gesamten Tabellenansicht ist übermäßig – Paulw11

0

Sie müssen der Tabellenansicht mitteilen, dass neue Daten vorhanden sind. Sie müssen auch berücksichtigen, dass die Netzwerkoperation wahrscheinlich in einer Hintergrundwarteschlange erfolgte und die UI-Aktualisierungen in der Hauptwarteschlange sein müssen:

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