2017-06-28 2 views
0

Ok, j'ai regardé performSegueWithIdentifier very slow when segue is modal et essayé des solutions similaires mais j'ai toujours un problème - Im travaillant dans Swift, et effectuant une segue basée sur un robinet d'une cellule VC de liste prend un bon 5-30 secondes. Il se bloque juste là avec la barre sélectionnée.Comment afficher l'indicateur de chargement jusqu'à ce que le segue soit effectué?

J'ai essayé excès de vitesse avec cette

DispatchQueue.main.async { 
self.performSegue(withIdentifier: "toPodcastPlayer", sender: self) 
} 

Cependant tout cela ne fut pas fait la barre sélectionner une couleur. Je dois afficher un écran de chargement si cela va se produire, mais quand cette func pour le chargement:

let loadView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) 
     loadView.backgroundColor = UIColor.green 
     loadView.center = CGPoint(x: screenSize.width/2, y: screenSize.height/2) 
     view.addSubview(loadView) 

Et ce quand on tape:

func tableView (_ tableView: UITableView, didSelectRowAt indexPath: indexPath) {

let selectedIndexPath : [IndexPath] = self.myTableView.indexPathsForSelectedRows! 

si (self.rssListToLoad [selectedIndexPath [0] .row] .link = "") { showLoading() self.performSegue (de withIdentifier: "toPodcastPlayer", expéditeur: auto)

et

if segue.identifier == "toPodcastPlayer" { 
      // find index path for selected row 
      let selectedIndexPath : [IndexPath] = self.myTableView.indexPathsForSelectedRows! 

      // deselect the selected row 
      self.myTableView.deselectRow(at: selectedIndexPath[0], animated: true) 

      // create destination view controller 
      let destVc = segue.destination as! PodcastViewController 

      // set title for next screen 
      destVc.adTxtName = "Skylar's Ad" 
      destVc.urlStr = self.rssRecordList[selectedIndexPath[0].row].link 
      destVc.trackLabel = self.rssRecordList[selectedIndexPath[0].row].title 

Il est encore retardée. Je ne comprends pas cela car la vue est déjà créée dans le storyboard et doit juste définir certaines variables dans le VC suivant. Quel est le problème ici?

Mon type de segment est un présent modal, non obsolète.

+0

Avez-vous essayé il profilage d'instruments pour voir ce qui prend tant de temps? Vos appels à 'didSelectRowAtIndexPath()' sont déjà sur le thread principal, et ne devraient pas être des appels asynchrones, vous n'avez donc pas besoin d'utiliser GCD ici. Que se passe-t-il dans votre 'PodcastViewController' lorsque vous définissez ces propriétés? –

+2

Une fois que vous appelez 'executeSegue', le segue est essentiellement validé (vous pouvez l'abandonner en retournant' false' de 'shouldPerformSegue'). Si vous avez besoin d'afficher une interface utilisateur de chargement, vous devez le faire dans le contrôleur de vue de destination. Vous devez également vous assurer que tout chargement est effectué de manière asynchrone sur un thread d'arrière-plan. Une fois le chargement terminé, supprimez l'interface de chargement et affichez les données chargées. – Paulw11

+0

Mon problème est indépendamment de ce que je fais dans la destination, le délai de "chargement" se produit sur la liste VC, puis un peu dans la destination. Si j'essaie de montrer un chargement comme je l'ai dit dans la liste, il ne l'affiche pas jusqu'à ce que le segue commence à fonctionner – skyguy

Répondre

0

Si vous devez afficher une interface de chargement dans les deux vc, vous pouvez ajouter l'interface de chargement dans la fenêtre

+0

Pouvez-vous montrer un exemple dans le code? Je ne sais pas ce que tu veux dire par là. Je voudrais aussi que tout le chargement se passe à destination, si possible – skyguy