2016-04-26 20 views
2

Ich habe das grundlegende Tutorial here zum Erstellen eines UIPageViewController, der durch verschiedene ViewController, die ich alle auf Main.Storyboard erstellt Swipe. Ich möchte eine Anwendung erstellen, die dynamische ViewControllers erzeugt, was bedeutet, dass ich die ViewControllers im UIPageViewController programmatisch instanziieren muss.So erstellen Sie einen dynamischen UIPageViewController

Ich versuche jedoch, alles ein bisschen weiter zu gehen. Ich werde eine dynamische Reihe von ViewControllern zur Anzeige basierend auf Daten in Firebase haben. Bei jedem Wischen möchte ich eine Ansicht instanziieren, die ein Bild enthält (das Bild wird in Amazon Web Services gespeichert und eine Verknüpfung zum Bild wird in Firebase gespeichert). Ich habe dieses Setup derzeit in meiner Android-Anwendung und benutze Picasso, um das Bild in mein Fragment zu laden.

Da all Daten dynamisch sein wird, möchte ich den besten Weg zu finden:

-Instantiate neuen Viewcontrollers auf Basis von dynamischen Daten, die Feuerbasis jeden Tag

-Haben jede Viewcontroller Anzeige wechselt das verknüpfte Bild, das ich in Firebase gespeichert habe

Alle ViewControllers haben das gleiche "Skelett", was bedeutet, dass jedes Bild mit einem Text versehen ist. Unten ist mein aktueller Code, und ich hatte gehofft, einige Ratschläge/Hilfe zu erhalten.

import UIKit 

class PageViewTutorial: UIPageViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     dataSource = self 
     if let firstViewController = orderedViewControllers.first { 
      setViewControllers([firstViewController], 
       direction: .Forward, 
       animated: true, 
       completion: nil) 
     } 
    } 

    //this will be dynamic based on firebase data 
    private(set) lazy var orderedViewControllers: [UIViewController] = { 
     return [self.newColoredViewController("Green"), 
      self.newColoredViewController("Red"), 
      self.newColoredViewController("Blue")] 
    }() 

    private func newColoredViewController(color: String) -> UIViewController { 
     return UIStoryboard(name: "Main", bundle: nil) . 
      instantiateViewControllerWithIdentifier("\(color)ViewController") 
    } 



} 


// MARK: PageViewTutorialDataSource 

extension PageViewTutorial: UIPageViewControllerDataSource { 

    func pageViewController(pageViewController: UIPageViewController, 
     viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
      guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else { 
       return nil 
      } 

      let previousIndex = viewControllerIndex - 1 

      guard previousIndex >= 0 else { 
       return nil 
      } 

      guard orderedViewControllers.count > previousIndex else { 
       return nil 
      } 

      return orderedViewControllers[previousIndex] 
    } 

    func pageViewController(pageViewController: UIPageViewController, 
     viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
      guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else { 
       return nil 
      } 

      let nextIndex = viewControllerIndex + 1 

      let orderedViewControllersCount = orderedViewControllers.count 

      guard orderedViewControllersCount != nextIndex else { 
       return nil 
      } 

      guard orderedViewControllersCount > nextIndex else { 
       return nil 
      } 

      return orderedViewControllers[nextIndex] 
    } 
} 
+0

Hallo, und was ist das Endziel? Wie sollte es für den Benutzer funktionieren? Es sieht wie eine Bildergalerie aus. Wenn dem so ist, denke ich nicht, dass Sie "dynamische ViewControllers" brauchen. Sie benötigen lediglich eine Sammlungsansicht mit cell.size = screen.size. Wie auch immer, wenn Sie diesen Satz brauchen, ist es besser, ihn über seine Variablen zu initiieren. Gib pls mehr Details. –

+0

Es ist im Grunde eine Abfrageanwendung. Jeden Tag werde ich eine bestimmte Anzahl von Umfragen zur Verfügung haben. Ich möchte, dass jeder ViewController eine Umfrage mit einem Bild, einer Frage und Abstimmknöpfen darstellt. Es ist dynamisch in dem Sinne, dass an Tag 1 10 Umfragen stattfinden, an Tag 2 nur 3 Umfragen .... – tccpg288

Antwort

1

Nach neuen Kommentaren würde ich es auf diese Weise tun:

  1. Make some Poll-Objekt mit Variablen Text, Bildern, id, Tag so auf.

  2. Vereinbaren Sie einen PollViewModel mit Poll-Objekt initialisiert, das auf die Datendarstellung reagieren wird

  3. Machen Sie eine UIViewController/UITableViewController Unterklasse mit PollViewModel initialisiert

  4. Machen Sie eine Subklassen von UITableViewCell für jeden Teil der Umfrage UI, das kann es in UITableView

  5. eine PageViewTutorial Klasse (oder eine eigene Ansichtsmodell) mit aktuellen Array von Poll von Firebase-Objekte initialisiert Stellen beand anzuzeigen

  6. In UIPageViewControllerDataSource behandeln Objekte von Array und Rückgabe VC initialisiert mit Modell initialisiert mit mit Abfrageobjekt. ;)

Verwandte Themen