Je rencontre un problème lorsque je souhaite utiliser une minuterie dans une cellule uitableview. À chaque fois que je défile vers le bas, puis à nouveau vers le haut, le compteur est remis à sa valeur d'origine.XCode Swift Timer recharge en mode table lors du défilement
Je sais quel est le problème ... la cellule get est rechargée lors du défilement arrière. Mais comment puis-je obtenir que la cellule ne soit pas rechargée lorsque je fais défiler vers le haut et vers le bas afin que je puisse garder la cellule d'origine. N'importe quel code de pseudo aiderait.
Mon code ressemble à ceci.
FirstViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor(hexString: "#bde8fb")
parseXhr(offset,limit:limit)
self.timer = NSTimer(timeInterval: 1.0, target: self, selector: #selector(FirstViewController.fireCellsUpdate), userInfo: nil, repeats: true)
NSRunLoop.currentRunLoop().addTimer(self.timer, forMode: NSRunLoopCommonModes)
// Do any additional setup after loading the view, typically from a nib.
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// algemene cell gegevens
let cell = self.tv.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell
let separator = UIView(frame: CGRectMake(0, 0, cell.bounds.size.width, 20))
separator.backgroundColor = UIColor(hexString: "#bde8fb")
cell.contentView.addSubview(separator)
cell.photo.setBottomBorder("#bde8fb")
cell.timeInterval = self.timercounter[indexPath.row]
// load the image
cell.photo.contentMode = UIViewContentMode.ScaleAspectFit
cell.photo.kf_setImageWithURL(NSURL(string:"\(Config.image_dir)\(imageUrlArray[indexPath.row])"),placeholderImage: UIImage(named: Config.lazyLoadImage))
// set the product name
cell.veiling_title.text = productNameArray[indexPath.row]
cell.veiling_title.textAlignment = .Center
return cell
}
func fireCellsUpdate() {
let notification = NSNotification(name: "CustomCellUpdate", object: nil)
NSNotificationCenter.defaultCenter().postNotification(notification)
}
Et mon CustomCell.swift ressemble à ce
var timercounter = 0
@IBOutlet var veiling_title: UITextView!
@IBOutlet var photo: UIImageView!
@IBOutlet var veilingSeconds: UILabel!
var timeInterval: Int = 0 {
didSet {
self.veilingSeconds.text = "\(timeInterval)"
}
}
func updateUI() {
if self.timeInterval > 0 {
self.timeInterval -= 1
}
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
let notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.addObserver(self, selector: #selector(CustomCell.updateUI), name: "CustomCellUpdate", object: nil)
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
Vous devez mettre à jour le modèle ('timercounter') au chemin d'index particulier chaque fois que 'timeInterval' change pour conserver la synchronisation du modèle et de la vue. – vadian
merci, avez-vous un extrait de code pour moi? Dois-je mettre à jour ceci dans le FirstViewController.swift? – erwinnandpersad
Dans 'cellForRowAtIndexPath' je passerais le chemin d'index (la ligne est suffisante) à la cellule.Vous pouvez ensuite mettre à jour le compteur dans le tableau 'timercounter' de la cellule directement. Si 'timercounter' est un type de valeur, n'oubliez pas d'assigner la valeur modifiée au tableau. – vadian