在我的Swift
應用程序中,我有一個UITableView
和UITextView
。這個想法很簡單,當用戶添加文本時 - 它應該出現在表格視圖的底部。追加新內容和刷新UITableView凍結我的應用程序在Swift中幾秒鐘
所以,我有我的目標SingleMessage
數組:
var messages = [SingleMessage]()
當用戶添加一個文本UITextView
,我發送消息Socket.IO
和接受它:
func messageArrived(_ notification: Notification) {
if let message = (notification as NSNotification).userInfo?["message"] as? SingleMessage {
DispatchQueue.main.async(execute: {() -> Void in
messages.append(message)
self.tview.reloadData()
self.scrollToBottom()
)}
}
}
我的函數scrollToBottom()
包含以下代碼:
if(self.messages.count > 0) {
let iPath = IndexPath(row: self.tview.numberOfRows(inSection: 0)-1, section: self.tview.numberOfSections-1)
self.tview.scrollToRow(at: iPath, at: UITableViewScrollPosition.bottom, animated: false)
}
,然後我有cellForRow
功能,也做了很多的東西,比如設置字體和文本爲每個標籤等
override func tableView(_ tview: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tview.dequeueReusableCell(withIdentifier: "chat") as! SingleCommentCell
if let msg:SingleMessage = self.messages[(indexPath as NSIndexPath).row] as? SingleMessage {
.
.
.
我的問題是,當我輸入一些東西,然後立即開始並按下按鈕send
再次打字 - 整個界面凍結了幾秒鐘,我什至都沒有看到鍵盤的反饋。我認爲問題在於表格視圖必須完全刷新。
我在聊天組件中使用上面的接口,所以不僅當用戶在一行中快速鍵入幾條消息,而且還有很多傳入消息時,都會出現問題。
有什麼方法可以加快整個界面,例如在表格視圖底部添加新單元格,並避免刷新已存在的單元格?
與我UITableViewController
的其他功能:
override func tableView(_ tview: UITableView, numberOfRowsInSection section: Int) -> Int {
return messages.count
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
然後,我有:
override func viewDidLoad() {
super.viewDidLoad()
tview.separatorStyle = UITableViewCellSeparatorStyle.none
tview.backgroundColor = UIColor.clear
tview.delegate = self
tview.dataSource = self
self.tview.estimatedRowHeight = 100
NotificationCenter.default.addObserver(self, selector: #selector(ChatView.messageArrived(_:)), name: NSNotification.Name(rawValue: incomingMessage), object: nil)
}
誠實的問題。爲什麼要把這個標記爲Swift?這聽起來像很多**更廣泛。沒有什麼特別的語言。 – dfd
這是一個快速的問題。沒有錯。 –
不相關,但如果'messages'顯然是非可選的,爲什麼你可以將它綁定在'cellForRowAt'中?簡單地寫'讓msg = self.messages [indexPath.row]'不帶大括號。並且不要從(表格)視圖獲取行數,從'messages'數量中獲取。最後'DispatchQueue'閉包不會被編譯。 – vadian