2015-09-14 43 views
0

我有一個在故事板中設計的模仿聊天UI的tableView。的細胞組成:在tableView中更改以前單元格的屬性

  • 的TextView消息文本
  • 發件人的簡介的圖片

眼下,輪廓圖像被顯示在每個細胞,旁文字泡泡。這很好,但如果同一用戶直接在另一個用戶之後發送兩條或更多條消息,則配置文件圖像應該只顯示在最後一個泡泡上,而不是上一個。

我打過電話的cellForRowAtIndexPath拿到前一小區的屬性和更改配置文件圖像的隱藏屬性,但是這給了我兩個問題:

  1. 我打電話的cellForRowAtIndexPath的cellForRowAtIndexPath ,因爲這是我製作單元格UI的位置,並決定是否將配置文件圖像隱藏起來。我認爲在自己內部調用此方法不是一個好主意。
  2. 有時(上下滾動速度非常快)無法正常工作。

我也試過所有單元存儲在一個字典(indexPath.row:小區),所以速度更快後,我可以訪問它,但是這也就是給了我同樣的問題,向上滾動時,它不工作,下降非常快。

這是應該的一個例證:http://tinypic.com/view.php?pic=2qavj9w&s=8#.Vfcpi7yJfzI

+1

你將不會調用相同的方法,因爲一個'cellForRowAtIndexPath'在* your *類中作爲數據源方法,另一個在tableview中,但是,這種方法存在問題,因爲您已經找到了。當你爲最後一條消息創建新行時,你可能會調用'insertRowsAtIndexPaths'。和你一樣,在你需要更新的行中調用'reloadRowaAtIndexPaths'。然後在'cellForRowAtIndexPath'中,你只需要根據可用的數據正確渲染單元 – Paulw11

回答

0

你需要你的cellForRowAtIndexPath方法裏面都向前看,作爲Paulw11建議,在插入電池後撥打reloadRowsAtIndexPaths

import UIKit 

struct MyMessage { 
    let sender: String 
    let text: String 
} 

class MyTableViewCell: UITableViewCell { 
    var message: MyMessage? 
    var showProfileImage: Bool = false 
} 

class MyTableViewController: UITableViewController { 

    private var _messages: [MyMessage] = [] 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self._messages.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let message = self._messages[indexPath.row] 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! MyTableViewCell 
     cell.message = message 
     if self._messages.count > indexPath.row + 1 { 
      let nextMessage = self._messages[indexPath.row + 1] 
      cell.showProfileImage = message.sender != nextMessage.sender 
     } else { 
      cell.showProfileImage = true 
     } 
     return cell 
    } 

    func addMessage(message: MyMessage) { 
     let lastIndexPath = NSIndexPath(forRow: self._messages.count - 1, inSection: 0) 
     let indexPath = NSIndexPath(forRow: self._messages.count, inSection: 0) 
     self._messages.append(message) 
     self.tableView.beginUpdates() 
     self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Bottom) 
     self.tableView.reloadRowsAtIndexPaths([lastIndexPath], withRowAnimation: UITableViewRowAnimation.Fade) 
     self.tableView.endUpdates() 
    } 
} 
+0

這是可行的,但是當我滾動得非常快時,它不會 – user3656454

相關問題