![]() |
UIPageViewController bestimmte Seite
Hallo,
hat jemand ne Ahnung, wie ich im UIPageViewController manuell zu einer Seite springen kann? Also per Code. Viele Grüße Croco |
AW: UIPageViewController bestimmte Seite
Das hängt ganz stark von deiner Implementation ab.
Besonders der Aufbau der DataSource und der Methode "viewControllerAtIndex". Im schlimmsten Fall setzt Du dein "viewControllers" Array auf "nil", baust es neu auf, ermittelst mit "indexOfViewController" den richtigen Seitenindex und blätterst dort hin. Das Blättern kann mit und ohne Animation gemacht werden. Je nachdem ob "schick" oder "schnell" wichtig ist. Solange Du keine Code zeigst, gibt es einfach zu viele Möglichkeiten. |
AW: UIPageViewController bestimmte Seite
Zitat:
Delphi-Quellcode:
Die sache ist die, dass ich beim Programmstart auf eine bestimmte Seite blättern muss (passiert im Hintergrund, also ohne Animationen). Was schlägst du mir hierfür vor?
FPager:= TTMSFMXNativeUIPageViewController.Create(Self);
FPager.Parent:= Self; FPager.Align:= TAlignLayout.alClient; for n:= Low(FTestViews) to High(FTestViews) do begin FTestViews[n]:= TTestView.Create(FPager); with FTestViews[n] do begin Parent:= FPager; Align:= TAlignLayout.alClient; Initialize; end; FPager.Pages.Add.View:= FTestViews[n]; end; FPager.Initialize; |
AW: UIPageViewController bestimmte Seite
Das ist ähnlich, aber leider nicht 1:1 in CocoaTouch übersetzbar.
Der UIPageViewController ist Datasource getrieben und "navigiert" von der aktuellen Seite mit "prior" und "next" zwischen den Seiten. Ich zeig Dir mal meins. Eventuell hilft es Dir ja ein Stück weiter.
Delphi-Quellcode:
Der PageViewController zeigt nun die Seite mit dem aktuellen Jahr an (bzw. startet auch gleich dort ohne "umzublättern").
method RootViewController.setupPageViewController(Sender:id);
begin // Das entspricht bei Dir sinngemäß FPager.Pages.Clear; ModelController.resetViewControllerCache; // Alle ViewController die noch irgendwo auf dem PageController gecachet "herumliegen " werden auch weggeworfen for i:Int32 :=0 to pageViewController.viewControllers.count-1 do begin pageViewController.viewControllers[i].removeFromParentViewController; end; // Hier ermittle ich den Index der Seite, bei der gestartet werden soll // pageData ist bei mir ein Array [2010,2011,2012,2013,2014,2015,2015].... // indexCurrentYear ist also "heute" = 4 var indexCurrentYear := ModelController.pageData.indexOfObject(currentYear); // Jetzt hole ich mir den einen ViewController (für das aktuelle Jahr) aus dem Model ... var lbeginningingViewController := ModelController.viewControllerAtIndex(indexCurrentYear) storyboard(storyboard); // ... und lege ihn als einziges Object in ein Array var lViewControllers := NSArray.arrayWithObject(lbeginningingViewController); // Zum Schluss gebe ich dem UIPageViewController das Array mit dem // StartViewController. pageViewController.setViewControllers(lViewControllers) direction(UIPageViewControllerNavigationDirectionForward) animated(false) completion(nil); // PageViewController in den RootViewController einbetten und GestureRecognizer zuweisen addChildViewController(pageViewController); view.addSubview(pageViewController.view); view.gestureRecognizers := pageViewController.gestureRecognizers; end; Jede Seite (also jeder ViewController) hat eine Property, in der ich den aktuellen Seitenindex speichere. Beim Blättern holt sich der UIPageViewController die vorhergehende bzw. nachfolgende Seite über die UIPageViewControllerDataSource Methoden "viewControllerBeforeViewController" und "viewControllerAfterViewController". Dort lese ich die Property mit den aktuellen Seitenindex aus den aktuellen ViewController aus und hole mir den vorherigen bzw. nächsten ViewController aus dem Model. |
AW: UIPageViewController bestimmte Seite
Zitat:
Es ist tückisch die Views für alle Seiten vorab zu initialisieren. iOS schmeißt nicht angezeigte Views weg, wenn der Speicher knapp wird oder diese länger nicht aufgerufen wurden. Der UIPageViewController erwartet dann, dass die PageViewController DataSource den View der anzuzeigenden Seite bei Bedarf neu initialisiert. Ich habe das auch zuerst so gemacht wie Du und habe mich gewundert, warum der PageViewController sporadisch nicht zu einer vermeidlich existierenden Seite umblättert oder die App crasht. Wenn eine Seite (View) von iOS freigegeben wurde, dann liegt in deinem "Controller Array" für diese Seite ein NIL. Bekommt der PageViewController ein NIL von der DataSource, dann heißt das für ihn "erste bzw. letzte Seite" erreicht. Da kannst eine Weile hinterherdebuggen.. :wink: |
AW: UIPageViewController bestimmte Seite
Erstmal vielen Dank für die ausfühliche Erklärung zum manuelle umblättern! Sobald ich zuhause bin werde ich mal gucken, was ich daraus machen kann.
Zitat:
Wo wir schon bei Tücken sind: Ich habe schon eine Weile das Problem, dass total willkürlich manche Seiten sich nicht mit der Wisch-Geste umblättern lassen. D.h., dass dann nur noch ein Klick auf den Seitenrand möglich ist, um umzublättern. Nach einem Neustart der App kann wieder alles funktionieren, oder andere Seiten fallen aus. Ist dir das schonmal begegnet? Vllt. hängt das ja mit genau dem zusammen? |
AW: UIPageViewController bestimmte Seite
Zitat:
Am besten ist es, die "Seiten-Views" über die UIPageViewControllerDataSource Methoden über die UIPageViewControllerDataSource Methoden "viewControllerBeforeViewController" und "viewControllerAfterViewController" dynamisch zu laden. Falls da zu viel zeitfressender Kram passiert, dann kann man den langsamen Teil asynchron in die "Global Queue" verlagern oder über eine "NSOperation" (falls du da herankommst) vom GUI Thread entkoppeln. Notfalls kann man die Seiten auch nach Deiner Methode vorinitialisieren und ggf. freigegebene Views in den DataSource Methoden (viewController/Before/After/ViewController) neu aufbauen. Ob es beim Review durchgeht, wenn die App beim Starten gleich den ganzen freien iPhone RAM okkupiert weiß ich allerdings nicht :wink: |
AW: UIPageViewController bestimmte Seite
Hab die Klasse so ergänzt, funktioniert einwandfrei :)
Delphi-Quellcode:
procedure TTMSFMXNativeUIPageViewController.SetActivePage(APageIndex: Integer);
var ActivePage: TTMSFMXNativeUIViewController; VC: NSArray; begin if (APageIndex < 0) and (APageIndex > Pages.Count - 1) then exit; ActivePage:= FPages.Items[APageIndex].View; VC:= TNSArray.Wrap(TNSArray.OCClass.arrayWithObject((ActivePage.ViewController as ILocalObject ).GetObjectID)); PageViewController.setViewControllers(VC, UIPageViewControllerNavigationDirectionForward, true, nil); GetViewForPage(APageIndex); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz