2016-08-17 2 views
1

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 
} 
+0

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

+0

merci, avez-vous un extrait de code pour moi? Dois-je mettre à jour ceci dans le FirstViewController.swift? – erwinnandpersad

+0

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

Répondre

0

Essayez le

suivant

En FirstViewController à la fin de cellForRowAtIndexPath juste avant la return ligne dans SERT

cell.callback = { (interval) in 
    self.timercounter[indexPath.row] = interval 
} 

En CustomCell ajouter une propriété

var callback : ((Int) ->())? 

et changer timeInterval

var timeInterval: Int = 0 { 
    didSet { 
    self.veilingSeconds.text = "\(timeInterval)" 
    callback?(timeInterval) 
    } 
} 

L'avantage de la fonction de rappel est qu'il peut capturer le tableau timercounter et met à jour la valeur de l'indice chemin en conséquence chaque fois que timeInterval change.

+0

Merci pour votre réponse, mais cela ne fonctionne toujours pas :(:(. J'ai créé un sens avec votre implémentation.Vous voyez peut-être quelque chose.Je suis très curieux de savoir comment la minuterie ne se recharger (passer 2 jours maintenant pour le comprendre) .... [FirstviewController] (https://gist.github.com/ermst4r/51410cfb427809b18ae34b3d646d977d) [Customcell.swift] (https://gist.github.com/ermst4r/fb29c4ec3265ea6192b8d951fd162500) – erwinnandpersad

+0

Peut-être que la question se trouve ailleurs. Le rappel est censé fonctionner – vadian

0

Ok, j'ai enfin réussi!

Mon problème était que je devais créer plusieurs minuteries dans une tableview. Chaque fois que je faisais défiler le chronomètre, le chronomètre donnait des résultats étranges (comme des secondes qui ne sont pas correctes, comme des étiquettes qui se chevauchent et des temps incorrects). J'ai créé 2 fois dans mes FirstViewControllers

1 Une minuterie ajouter toutes les secondes dans le tableview, laisse dit GlobalTimerArray

une autre minuterie ce 2. Et exécute toutes les secondes pour décrémenter GlobalTimerArray

Puis dans mon cellForRowAtIndexPath je fais quelque chose comme ceci:

if !self.loadedCells.contains(indexPath.row) { 
     self.loadedCells.append(indexPath.row) 
     loadSeconds(cell, indexPath: indexPath) 
    } else { 

     cell.timeInterval = self.saveSeconds[indexPath.row] 
     print(secondsToHoursMinutesSeconds(self.saveSeconds[indexPath.row])) 

    } 

et mon viewDidLoad ressemble à quelque chose comme ceci:

override func viewDidLoad() { 

    self.view.backgroundColor = UIColor(hexString: "#bde8fb") 

    socket.connect() 
    self.timer = NSTimer(timeInterval: 1.0, target: self, selector: #selector(FirstViewController.fireCellsUpdate), userInfo: nil, repeats: true) 
    NSRunLoop.currentRunLoop().addTimer(self.timer, forMode: NSRunLoopCommonModes) 
    parseXhr(offset,limit:limit) 
    self.secTimer = NSTimer(timeInterval: 1.0, target: self, selector: #selector(FirstViewController.decSeconds), userInfo: nil, repeats: true) 
    NSRunLoop.currentRunLoop().addTimer(self.secTimer, forMode: NSRunLoopCommonModes) 
    super.viewDidLoad() 


    // Do any additional setup after loading the view, typically from a nib. 
} 




func decSeconds() 
{ 
     for index in 0..<self.saveSeconds.count { 
     self.saveSeconds[index] -= 1 
    } 
} 

J'espère que cela aide quelqu'un, pour moi, il était difficile de comprendre, mais peut-être est parce que c'est ma première application ce que je suis en train d'écrire à Swift :)