2017-06-12 67 views
0

我正在構建一個日曆應用程序,其中某人某天的空閒時間將以短消息和三種不同圖像之一作爲此單元格的背景突出顯示。如何阻止我的細胞圖像每次從屏幕熄滅時改變?

什麼是最好的方法來停止圖像每次細胞熄滅屏幕時改變? 這個邏輯應該在UITableViewCell中嗎?

class FreeTimeCell: UITableViewCell { 


    @IBOutlet weak var background: UIImageView! 
    @IBOutlet weak var freeTimeMessage: UILabel! 
    @IBOutlet weak var freeTimePeriod: UILabel! 
    @IBOutlet weak var freeTime: UILabel! 

    var timeblock: Timeblock! { 
     didSet { 

      self.freeTimePeriod.text = "\(timeblock.startTime.dateToString()) - \(timeblock.endTime.dateToString())" 
      self.freeTime.text = "OccupiedTime.FreeTime".localized 
      self.freeTimeMessage.text = MessagesInteractor.getFreetimeTimeblock() 
      let randomNumber = arc4random_uniform(3) 
      let imageName = "freetime\(randomNumber)" 
      self.background.image = UIImage(named: imageName) 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     //removes highlighting of the cell when tapping on it 
     self.selectionStyle = UITableViewCellSelectionStyle.none 

    } 

TableViewController

/** 
Checks which data cell type belongs to this cell, and returns correct table cell accordingly 
*/ 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    switch self.dataCells[indexPath.row].cellType { 
    case .ConflictHeader, .TimeToFirstMeetingHeader : 
     return self.generateHeaderCell(indexPath: indexPath) 
    case .FreeTime: 
     return self.generateFreeTimeCell(indexPath: indexPath) 
    case .SingleMeeting: 
     return self.generateSingleMeetingCell(dataCell: self.dataCells[indexPath.row], indexPath: indexPath) 
    } 
} 
/** 
Generates Free Time Cell (between meetings to show user free spot) 
- parameter indexPath: used to dequeue the reusable cell 
- returns: Free time cell generated 
*/ 
private func generateFreeTimeCell(indexPath: IndexPath) -> FreeTimeCell { 
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "FreeTimeCell", for: indexPath) as! FreeTimeCell 
    cell.timeblock = self.dataCells[indexPath.row].timeblock 
    return cell 
} 
+0

單元格在離開屏幕時會被重用,您不希望更改此行爲,因爲這樣做會佔用較少的內存。您只需設置圖像超時顯示單元格。 – rckoenes

+0

@ rckoenes我很懷疑這件事是否可取。也許我應該創建一個類變量與最初分配的圖像,所以當一個新的隨機數生成時它不會改變? – Deco

+0

另外,在你的代碼中,你是否讓一個單元出隊,看起來你每次都創建一個新的單元。你的應用程序將有非常好的牀位表現你需要使用['dequeueReusableCell(withIdentifier:)'](https://developer.apple.com/documentation/uikit/uitableview/1614891-dequeuereusablecell) – rckoenes

回答

2

目前,當你造型的單元格,您使用的是隨機數確定單元格的背景。相反,將這個邏輯拉出單元格並進入tableview。如果你這樣做,那麼你可以跟蹤你正在使用的圖像,並將正確的圖像設置到單元格,以便在滾動時保持一致。

對於您的情況,您可以將另一個變量添加到設置圖像編號或圖像名稱的Timeblock類中,並使用該變量將圖像加載到單元格中。

+0

爲什麼我們將圖像名稱或數字設置爲變量而不是「UIImage」本身? – Deco

+0

您可以將UIImage保存在此處,但由於圖像未通過網絡,因此再次創建它的開銷可以忽略不計。 –