2017-06-12 2 views
0

Ich baue eine Kalender-App, in der die Freizeit an einem bestimmten Tag mit einer kurzen Nachricht und einem von drei verschiedenen Bildern als Hintergrund für diese Zelle hervorgehoben wird.Wie kann ich verhindern, dass sich das Bild meiner Zellen jedes Mal ändert, wenn es vom Bildschirm verschwindet?

Was wäre der beste Weg, um zu verhindern, dass sich das Bild jedes Mal ändert, wenn die Zelle vom Bildschirm verschwindet? Sollte diese Logik innerhalb der UITableViewCell sein?

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

Zellen werden wiederverwendet, wenn sie nicht auf dem Bildschirm angezeigt werden. Sie möchten dieses Verhalten nicht ändern, da dadurch weniger Speicher belegt wird. Sie legen das Bild nur dann fest, wenn die Zelle angezeigt wird. – rckoenes

+0

@rckoenes Gut zu wissen Ich hatte meine Zweifel, dass dies wünschenswert ist. Vielleicht sollte ich einfach eine Klassenvariable mit dem Bild erstellen, das ursprünglich zugewiesen wurde, so dass es sich nicht ändert, wenn eine neue Zufallszahl generiert wird? – Deco

+0

Auch wo in Ihrem Code entfernen Sie eine Zelle, es sieht so aus, als ob Sie jedes Mal eine neue Zelle erstellen. Ihre App wird sehr leistungsfähig sein. Sie müssen ['dequeueReusableCell (withIdentifier:)'] (https://developer.apple.com/documentation/uikit/uitable/1614891-dequeuereusablecell) verwenden. – rckoenes

Antwort

2

Zeit, wenn Sie die Zelle Styling, führen Sie eine Zufallszahl mit dem Hintergrund der Zelle zu bestimmen. Ziehen Sie diese Logik stattdessen aus der Zelle und in die Tabellenansicht. Wenn Sie das tun, können Sie verfolgen, welches Bild Sie verwenden, und das richtige Bild für die Zelle festlegen, um beim Scrollen die Dinge konsistent zu halten.

In Ihrem Fall können Sie der Timeblock-Klasse eine weitere Variable hinzufügen, die die Bildnummer oder den Bildnamen festlegt und diese verwendet, um das Bild in die Zelle zu laden.

+0

Warum setzen wir den Bildnamen oder die Bildnummer als Variable und nicht als 'UIImage' selbst? – Deco

+0

Sie können das UIImage hier als stattdessen speichern, aber da das Bild nicht über das Netzwerk kommt, ist der Aufwand, es erneut zu erstellen, vernachlässigbar. –

Verwandte Themen