AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS UIPageViewController bestimmte Seite
Thema durchsuchen
Ansicht
Themen-Optionen

UIPageViewController bestimmte Seite

Ein Thema von Crocotronic · begonnen am 22. Jan 2014 · letzter Beitrag vom 1. Feb 2014
Antwort Antwort
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#1

UIPageViewController bestimmte Seite

  Alt 22. Jan 2014, 16:28
Hallo,
hat jemand ne Ahnung, wie ich im UIPageViewController manuell zu einer Seite springen kann? Also per Code.

Viele Grüße
Croco

Geändert von Crocotronic (22. Jan 2014 um 17:51 Uhr)
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

AW: UIPageViewController bestimmte Seite

  Alt 27. Jan 2014, 11:23
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.
  Mit Zitat antworten Zitat
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#3

AW: UIPageViewController bestimmte Seite

  Alt 27. Jan 2014, 14:07
Solange Du keine Code zeigst, gibt es einfach zu viele Möglichkeiten.
Es handelt sich um den UIPageViewController von TMS. So erzeug ich das Ding:
Delphi-Quellcode:
 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;
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?
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#4

AW: UIPageViewController bestimmte Seite

  Alt 27. Jan 2014, 15:13
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:
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;
Der PageViewController zeigt nun die Seite mit dem aktuellen Jahr an (bzw. startet auch gleich dort ohne "umzublättern").
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.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#5

AW: UIPageViewController bestimmte Seite

  Alt 27. Jan 2014, 16:38
Es handelt sich um den UIPageViewController von TMS. So erzeug ich das Ding:
Delphi-Quellcode:
 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;
Was vielleicht auch noch wichtig ist...
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..
  Mit Zitat antworten Zitat
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#6

AW: UIPageViewController bestimmte Seite

  Alt 27. Jan 2014, 17:18
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.
Was vielleicht auch noch wichtig ist...
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.
Das ist gut zu wissen! Aber wenn man das nicht beim Programmstart initialisiert, wann sonst, ohne den Prorgammfluss ins Stocken zu bringen?

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?
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#7

AW: UIPageViewController bestimmte Seite

  Alt 27. Jan 2014, 17:43
Was vielleicht auch noch wichtig ist...
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.
Das ist gut zu wissen! Aber wenn man das nicht beim Programmstart initialisiert, wann sonst, ohne den Prorgammfluss ins Stocken zu bringen?

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?
Blättert nicht zu einer vermeidlich vorhandenen Seite, GestureRecogniter nicht verbunden, NullPointerException ... Das hört sich genau nach solchen Speicherbereinigungseffekten an.


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
  Mit Zitat antworten Zitat
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#8

AW: UIPageViewController bestimmte Seite

  Alt 1. Feb 2014, 16:30
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;

Geändert von Crocotronic ( 1. Feb 2014 um 18:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz