2017-07-23 5 views
2

Je suis un nageur rapide et je fais une application météo simple. J'ai utilisé le modèle d'application basée sur les pages.Ajouter une nouvelle page dans PageViewController

Le problème que j'ai est le suivant:

Lorsque l'utilisateur ajoute une ville que j'appelle addCity et ajouter avec succès le nouveau nom de la ville à mon tableau de villes. Lorsque j'imprime ce tableau dans cette fonction, il montre la nouvelle ville à la fin. Cependant, la fonction viewControllerAtIndex qui crée une nouvelle page semble utiliser l'ancienne version de ce tableau, sans ajouter la nouvelle ville. Lorsque j'imprime le tableau des villes, il manque le nouveau nom de la ville. Par conséquent, lorsque les utilisateurs balaye, il n'y aura pas de nouvelle page pour la nouvelle ville rendue. L'utilisateur doit redémarrer l'application pour que la nouvelle ville apparaisse. J'ai créé une vidéo de capture d'écran pour illustrer le problème.

https://youtu.be/DbMqgJ0lONk

(le tableau des villes devrait aussi montrer « Londres », je pense que je n'ai pas redémarrer l'application)

Je vous serais reconnaissant toute aide ici!

import UIKit 

class ModelController: NSObject, UIPageViewControllerDataSource { 

    var rootViewController = RootViewController() 
    var cities = [""] 
    let defaults = UserDefaults.standard 

    override init() { 
     super.init() 

     self.cities = self.defaults.stringArray(forKey: "SavedStringArray") ?? [String]() 

     if self.cities == [""] || self.cities.count == 0 { 
      self.cities = ["Current Location"] 
     } 
    } 

    func addCity(name:String) { 
     self.cities.append(name) 
     self.defaults.set(self.cities, forKey: "SavedStringArray") 
     print ("cities from addCity:") 
     print (self.cities) 

    } 


    func viewControllerAtIndex(_ index: Int, storyboard: UIStoryboard) -> DataViewController? { 
     // Return the data view controller for the given index. 
     if (self.cities.count == 0) || (index >= self.cities.count) { 
      return nil 
     } 

     // Create a new view controller and pass suitable data. 
     let dataViewController = storyboard.instantiateViewController(withIdentifier: "DataViewController") as! DataViewController 

     //get city name 
     dataViewController.dataObject = self.cities[index] 
     print ("cities in viewControllerAtIndex:") 
     print (self.cities) 

     return dataViewController 
    } 



    func indexOfViewController(_ viewController: DataViewController) -> Int { 
     // Return the index of the given data view controller. 
     // For simplicity, this implementation uses a static array of model objects and the view controller stores the model object; you can therefore use the model object to identify the index. 
     return self.cities.index(of: viewController.dataObject) ?? NSNotFound 
    } 


    // MARK: - Page View Controller Data Source 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     var index = self.indexOfViewController(viewController as! DataViewController) 
     if (index == 0) || (index == NSNotFound) { 
      return nil 
     } 

     index -= 1 
     return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!) 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     var index = self.indexOfViewController(viewController as! DataViewController) 
     if index == NSNotFound { 
      return nil 
     } 

     index += 1 
     if index == self.cities.count { 
      return nil 
     } 
     return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!) 
    } 

} 
+0

Où définissez-vous la '' ModelController' pour le TableViewController'? Pouvez-vous coller ce code aussi? – cweinberger

+0

Hey @cweinberger! Voir tout le code ici: https://github.com/bjoern2000/FranzFahrenheit –

Répondre

0

Le problème est que vous utilisez deux instances différentes de ModelController. Un pour le RootViewController et un autre dans le TableViewController. Ils ne se connaissent pas.

deux options pour résoudre le problème:

1.) La main sur la même instance de ModelController-TableViewController lorsque vous Segue en elle.

E.g. en ajoutant cette prepare(for segue:) method to RootViewController`

func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

     if(segue.identifier == "Locations") { 

      let destVC: TableViewController = segue.destination as! TableViewController; 
      destVC.modelViewController = self.modelController; 

     } 
    } 

Cela garantira que sera remis le même ModelController plus.

Remarque: vous devez ajouter cet identificateur ("Emplacements") au segment passant du bouton Modifier à la scène TableViewController.

Note 2: ce code n'a pas été testé et ne compile probablement pas. Je n'ai pas Xcode disponible pour le moment.

2.) Assurez-vous qu'il ne peut y avoir plus d'une instance de ModelController (Singleton)

Un lien web au hasard: https://thatthinginswift.com/singletons/

+0

Cela a fonctionné. Je vous remercie! Je supposais qu'il s'agissait de ne pas utiliser la même instance. Le seul problème qui reste est quand je suis sur la dernière page dans le tableau, je dois balayer vers la gauche, puis encore à droite pour que le nouvel emplacement apparaisse. –

+0

Pour résoudre ce problème (et potentiellement d'autres cas intéressants, tels que la suppression de la ville actuellement affichée), vous devez probablement appeler ['setViewControllers (_: direction: animated: completion:)'] (https://developer.apple .com/documentation/uikit/uipageviewcontroller/1614087-setviewcontrollers). – cweinberger