2017-08-15 1 views
0

Dans mon projet Xcode, je charge les articles dans un Array et les affiche ensuite sur un UITableViewController. Pendant que ces éléments se chargent, le UITableViewController est vide et n'est pas esthétiquement plaisant, donc je veux mettre un indicateur d'activité dans le UITableViewController pendant le chargement des données. J'ai copié mon code en bas. Comment l'implémenter? (j'ai entendu quelque chose appelé un gestionnaire d'achèvement pourrait faire l'affaire, mais je ne suis pas sûr de savoir comment l'utiliser)Indicateur d'activité pendant les charges de table

func loadAnimals() { 
    let animalQuery = PFQuery(className: "Animals") 
    animalQuery.whereKey("userID", equalTo: PFUser.current()?.objectId! ?? String()) //getting which user 
    animalQuery.limit = 10 
    animalQuery.findObjectsInBackground { (objects, error) in 
     if error == nil { 
      self.colorArray.removeAll(keepingCapacity: false) 
      self.animalNameArray.removeAll(keepingCapacity: false)     
      self.animalTypeArray.removeAll(keepingCapacity: false) 

      for object in objects! { 
       self.colorArray.append(object.value(forKey: "colorType") as! String) // add data to arrays 
       self.animalNameArray.append(object.value(forKey: "animalName") as! String) // add data to arrays      
       self.animalTypeArray.append(object.value(forKey: "animalType") as! String) // add data to arrays 
      } 
      self.tableView.reloadData() 

     } else { 
      print(error?.localizedDescription ?? String()) 
     } 
    } 
} 

// met les couleurs en rangées

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! AnimalCell //connects to color cell 

    //Adds the animal information in the cells 
    cell.colorType.text = colorArray[indexPath.row] 
    cell.animalName.text = animalNameArray[indexPath.row] 
    cell.animalType.text = animalTypeArray[indexPath.row] 

    return cell 
} 
+0

double possible de [Lieu indicateur d'activité sur uitable vue] (https://stackoverflow.com/questions/29311093/place-activity-indicator-over-uitable- voir) – MwcsMac

Répondre

1

Il vous semble avoir une fonction asynchrone pour charger les données de vue de table. Vous avez juste besoin de mettre activityIndicator.stopAnimating() à l'intérieur là.

Ajoutez un UIActivityIndicatorView par programme ou par Storyboard à votre contrôleur de table. Si vous choisissez de le faire dans le code, voici comment vous le faites, y compris l'ajout de contraintes pour le maintenir au milieu de votre contrôleur de vue:

view.addSubview(activityIndicator) 
activityIndicator.translatesAutoresizingMaskIntoConstraints = false 
activityIndicator.hidesWhenStopped = true 
activityIndicator.color = UIColor.black 
let horizontalConstraint = NSLayoutConstraint(item: activityIndicator, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0) 
view.addConstraint(horizontalConstraint) 
let verticalConstraint = NSLayoutConstraint(item: activityIndicator, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0) 
view.addConstraint(verticalConstraint) 

Avant d'appeler le code ci-dessus à l'intérieur viewDidLoad(), déclarer quelque part let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) dans ta classe.

Il vous suffit de commencer à l'animer dès que loadAnimals commence l'exécution et l'arrête avant d'appeler le tableView.reloadData(). Nommez-le `activityIndicator, puis procédez comme suit:

func loadAnimals() { 
    activityIndicator.startAnimating() 
    let animalQuery = PFQuery(className: "Animals") 
    animalQuery.whereKey("userID", equalTo: PFUser.current()?.objectId! ?? String()) //getting which user 
    animalQuery.limit = 10 
    animalQuery.findObjectsInBackground { (objects, error) in 
     if error == nil { 
      self.colorArray.removeAll(keepingCapacity: false) 
      self.animalNameArray.removeAll(keepingCapacity: false)     
      self.animalTypeArray.removeAll(keepingCapacity: false) 

      for object in objects! { 
       self.colorArray.append(object.value(forKey: "colorType") as! String) // add data to arrays 
       self.animalNameArray.append(object.value(forKey: "animalName") as! String) // add data to arrays      
       self.animalTypeArray.append(object.value(forKey: "animalType") as! String) // add data to arrays 
      } 
      activityIndicator.stopAnimating() 
      self.tableView.reloadData() 

     } else { 
      print(error?.localizedDescription ?? String()) 
     } 
    } 
} 
+1

Super cela fonctionne parfaitement! Merci – fphelp

0
//SOMEWHERE ELSE IN YOUR CODE  
activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) 
    activityIndicator.hidesWhenStopped = true 
    self.view.addSubview(activityIndicator) 

///.... where you load animals 
func loadAnimals { 
/// 
    activityIndicator.startAnimating() 
    ////your code 
    ///... 
    animalQuery.findObjectsInBackground { (objects, error) in 
     if error == nil { 
     ///Stop the spinner 
     activityIndicator.stopAnimating() 
     ///...rest of your code 
     } 
     }