2017-09-21 5 views
0

J'essaie de montrer chaque mot dans une cellule de table avec une pause de 2 secondes entre chaque mot. Est-ce possible? Je ne veux pas garder rechargeant comme cette modification d'une cellule et rechargeant:Afficher un mot dans tableviewcell à la fois

var fullNameArr = message.characters.split{$0 == " "}.map(String.init) 
     var firstWord = true 
     for word in fullNameArr { 
      if firstWord { 
       firstWord = false 
      captionsArray.append(CaptionObject(isMacro:isMacro, number: numberToCall!.number, caption: word, time: String(describing:currentTimeInMiliseconds()))) 
       self.reloadTableAndScroll() 
      } else { 
       let cap = self.captionsArray.last! 
       cap.caption = cap.caption + " " + word 
       captionsArray.remove(at: captionsArray.count) 
       captionsArray.append(cap) 
       self.reloadTableAndScroll() 
      } 


      self.reloadTableAndScroll() 
     } 
+0

Exécutez une minuterie toutes les 2 secondes qui affiche le texte des cellules suivantes après le chargement du tableau. Il y a quelques détails plus délicats, mais peut-être que cela pourrait marcher pour vous – TNguyen

Répondre

0

Vous pouvez utiliser un Timer pour y parvenir.

Pour créer un Timer, simplement déclarer votre variable d'horloge en haut de votre classe, et l'initialiser dans votre méthode viewDidLoad:

var timer: Timer? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(addWordCell), userInfo: nil, repeats: true) 

    // ... 
} 

Maintenant toutes les 2 secondes, votre méthode addWordCell sera appelée. D'ailleurs, je vous suggère d'utiliser la méthode insertsRows au lieu de recharger votre vue de table tout le temps, ce sera beaucoup plus efficace. Par exemple, vous pouvez écrire votre méthode addWordCell comme ceci:

var words = [String]() 

var currentWordIndex = 0 

let sentence = "Hello how are you doing today?" 

func addWordCell() { 

    let wordsArray = sentence.components(separatedBy: " ").map({ $0 }) 

    guard currentWordIndex < wordsArray.count else { 
     return 
    } 

    words.append(wordsArray[currentWordIndex]) 

    tableView.beginUpdates() 
    tableView.insertRows(at: [IndexPath(row: words.count-1, section: 0)], with: .fade) 
    tableView.endUpdates() 

    currentWordIndex += 1 
} 

Et vous bien sûr besoin de changer votre point de vue tableau des méthodes de source de données:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return words.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) 

    cell.textLabel?.text = words[indexPath.row] 

    return cell 
} 

Maintenant, si vous voulez ajouter un joli petit fading effet chaque fois qu'une nouvelle cellule apparaît, vous pouvez utiliser la méthode willDisplayCell:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 

    cell.alpha = 0.0 

    UIView.animate(withDuration: 0.6, animations: { 

     cell.alpha = 1.0 
    }) 
} 

Ca y est! Évidemment, vous pouvez améliorer le code encore plus, et le personnaliser selon vos besoins, mais au moins cela devrait vous donner un petit exemple de travail montrant une approche possible.