UIScrollView mit PageControl in TabBar Controller

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIScrollView mit PageControl in TabBar Controller

    Schönen Abend zusammen,

    da ich jetzt schon zu lange an meinem Problem sitze (was für die meisten wohl kein Problem ist ;),
    wollte ich mich an euch wenden und um eure Hilfe bitte:

    Jetzt folgt etwas verwirrung:

    Ich hab eine einfache TabBar in der ich mit einem UIScrollView in Verbindung mit UIPageControl 3 UIviews
    anzeigen möchte, die einen Tableview enthalten, bei seitenwechsel, soll der neue view mit einem neuen
    wert iniziert werden. (Quasi genauso wie im Homescreen, mit den den Punkten, etc.)

    Wie ein ScrollView funktioniert usw. weiß ich ;) ich hab damit auch schon was programmiert, aber ich bekommst
    einfach nicht hin das geschilderte Problem in ne TabBar zu packen.

    ...Bisher hab ich eine SwitchViewController (NSObject) klasse, die mir quasi die Views verwaltet und bei seitenwechsel den neuen iniziiert,
    zumindest soll er das tun ;). In den SwitchViewController erstell ich ein erstell ich mir dann ein objekt vom tabellencontrollers.
    Wenn ich aber dann in der TabBar den SwitchController angebe bzw. das Nib dazu, wirft er mir immer ne Exception.

    Vll. hat jemand einen Denkanstoss oder ein Codesample, der/das mir hier auf die Sprünge hilft. Ich würds auch wenns geht
    gern ohne IB programmatisch umsetzen, hab das leider noch nicht so richtig 100% gelernt bei nem Scrollview.

    Ich hoffe ihr habt das Szenario verstanden, wenn nicht, versuch ichs gern nochmal ;).

    Vielen Dank schon mal an alle!!
  • Vielleicht kannst Du das Problem erst mal in kleine einzelne Stück zerlegen. Mir ist z.B. nicht klar, was der TabBarController mit dem ScrollView zu tun hat? ?(

    Mit einem TabBarController kannst Du zwischen verschiedenen ViewController "umschalten". Wenn einer diese ViewController jetzt einen ScrollView mit Paging enthalten soll, dann sehe ich die von Dir angedeutete Verbindung zum TabBarController nicht.

    Liegt Dein Problem jetzt bei dem ViewController mit dem ScrollView oder bei der Verwendung dieses ViewController im TabBarController?
  • Ok, ich versuchs mal zu zerlegen:

    Ich habe einen TabBar Controller, dieser ist in meinem App der RootController. In einem Tab des Tabbar Controller, möchte ich jetzt
    dass er mir einen ScrollView mit PageControl anzeigt. Des weiteren habe ich eine UIView Klasse der nachdem sie allociert wird, mit einem Wert
    gefüttert wird "TabellenViewController *tabContrller = [TabellenViewController alloc]; tabController.xmlCont = ...*. Diese UIView Klasse möchte
    ich dann quasi mit meinem ScrollView anzeigen und bei jedem Seitenwechsel mit einem neuen Wert versehen.
    (Soll so aussehen wie bei der Wetter.com App von der Funktionalität her).

    Im IB habe ich mir zu der Klasse SwitchViewController (die quasi das switchen der Views in der Scrollview übernehmen soll) dann einen ScrollView
    angelegt und eine PageControl und diese dann mit dem Filesowner verknüpft. Danach habe ich im IB in der XIB vom TabBar bei dem Tab in dem der
    ScrollView geladen werden soll die Class angegeben (SwitchViewController) und das NIB dass er dazu laden soll.

    Wenn ich aber jetzt mein starte und zu diesem Tab gehe, stürzt er mir ab und wirft eine Exceptionl

    Ich hab quasi ein Problem meinen ScrollView im TabbarController anzeigen zu lassen.

    Der TabbarController verwaltet ja die Views wie du schon sagst, dann wird es in der .h meines SwitchViewControllers ein Fehler sein wenn ich
    wenn ich diese Klasse als NSOBject setze oder? Das müsste dann so sein: "SwitchViewController : UIView <UIScrollViewDelegate>" oder liege ich hier
    auch falsch?

    Ich hoffe ich habe jetzt nicht noch mehr verwirrung gestiftet.

    Vielen Dank für die Hilfe!!
  • So, also es funktioniert jetzt (ich mags nicht sagen :D ...Schreibfehler), nur folgendes funktioniert noch nicht, wenn ich in der loadScrollViewWithPage meinen View lade, übergebe ich ihm (ihm = Tabellenview) bei page 1 quasi den initPage Wert.
    dass passt, den Lädt er auch, aber wenn ich auf die 2te Seite wechsle, sollte er eigentlich den 2ten Wert nehmen, aber statt dessen, füllt er die Tabelle gar nicht sondern lädt nur das nib. Hier der Auszug:

    ScrollView:

    Quellcode

    1. - (IBAction)changePage:(id)sender {
    2. int page = pageControl.currentPage;
    3. // load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
    4. [self loadScrollViewWithPage:page - 1];
    5. [self loadScrollViewWithPage:page];
    6. [self loadScrollViewWithPage:page + 1];
    7. // update the scroll view to the appropriate page
    8. CGRect frame = scrollView.frame;
    9. frame.origin.x = frame.size.width * page;
    10. frame.origin.y = 0;
    11. [scrollView scrollRectToVisible:frame animated:YES];
    12. // Set the boolean used when scrolls originate from the UIPageControl. See scrollViewDidScroll: above.
    13. pageControlUsed = YES;
    14. }
    15. - (void)loadScrollViewWithPage:(int)page {
    16. if (page < 0) return;
    17. if (page >= kNumberOfPages) return;
    18. // replace the placeholder if necessary
    19. TabellenController *controller = [viewControllers objectAtIndex:page];
    20. if ((NSNull *)controller == [NSNull null]) {
    21. controller = [[[TabellenController alloc] initWithNibName:@"ErgebnisTabelle" bundle:nil] initWithPageNumber:page]; //WithPageNumber:page];
    22. [viewControllers replaceObjectAtIndex:page withObject:controller];
    23. [Cxmlcont release];
    24. [controller release];
    25. }
    26. // add the controller's view to the scroll view
    27. if (nil == controller.view.superview) {
    28. CGRect frame = scrollView.frame;
    29. frame.origin.x = frame.size.width * page;
    30. frame.origin.y = 0;
    31. controller.view.frame = frame;
    32. [scrollView addSubview:controller.view];
    33. }
    Alles anzeigen



    TabellenView:

    Quellcode

    1. - (void)viewDidLoad {
    2. if(pageNumber == 0){
    3. xmlcont = [[XMLController alloc] loadXMLbyURL:@"...page1.xml"];
    4. }else if(pageNumber == 1){
    5. xmlcont = [[XMLController alloc] loadXMLbyURL:@"...page2.xml"];
    6. }
    7. [self.ergebnisTabelle reloadData];
    8. [super viewDidLoad];
    9. // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    10. // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    11. }
    Alles anzeigen



    Er lädt quasi auf der 1ten Seite die Daten perfekt in den TableView aber auf der 2ten Seite, lädt er die Daten nicht mehr sondern
    zeigt einfach einen blanken tableview an, ohne daten.

    Vll. hast ne idee, nochmal tausend dank für deine hilfe!!
  • Beim UIPageControl fängt die currentPage bei 0 an. Wenn Du also auf die 2. Seite, also currentPage = 1, wechselst, dann lädt er in Deinem Code noch mal Seite 1. Du kannst Deine Seitenzählung entweder auch bei 0 starten oder beim Init des TabellenController mit page + 1 arbeiten. ;)
  • wird beides gelade, er übergibt die pages auch richtig an den Tabellenview, der kann sie auch richtig zu ordnen. Aber er nimmt den ersten wert und lädt aber der 2te interessiert ihn nicht. Dann liegt wohl eher der Fehler an der TableView oder?
  • hab das jetzt auch ausprobiert, das macht er einwandfrei, also an der XMLfile liegts gott sei dank nicht. Er geht auch in beide if-abfragen rein, also if page=0 und page = 1. Danach geht er und lädt den Tableview, aber für das 2te xml, mag er
    nicht, da lädt er nur das nib ohne inhalt. Würde es dir was helfen wenn ich dir den code aus der TabellenView.m mal paste, vll. findest was!? Auch beim 2ten lesen find ich den Fehler nicht.
  • da fällt mir noch was ein, wenn der ScrollView lädt, zeigt er mir nichts an, erst wenn ich "wische" lädt er, hat das was mit become active zu tun? Kann ich das irgendwie umgehen,
    dass er den View gleich lädt und nicht wenn er erst "benutzt" wird?


    Was mir noch aufgefallen ist, dass er bei der 2ten seite die "DataSource und die delegate" nicht lädt, kann das damit zusammen hängen dass er bei der 2te Seite nur das Nib lädt? Denn meine programmatisch erstellte Zellenanpassung lädt er auch nicht. bzw. er lädt anscheinend aus der .m gar nix :(!

    Vielen Dank!!!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pretime ()

  • hab das Problem gelöst:

    im TableView hab ich geschrieben:

    Quellcode

    1. if(pageNumber == 0){ xmlcont = [[XMLController alloc] loadXMLbyURL:@"...page1.xml"];
    2. }else if(pageNumber == 1){
    3. xmlcont = [[XMLController alloc] loadXMLbyURL:@"...page2.xml"];
    4. }



    aber richtig ist:

    Quellcode

    1. xmlcont = [XMLController alloc];
    2. if(pageNumber == 0){
    3. [xmlcont loadXMLbyURL:@"page1.xml"];
    4. }
    5. if(pageNumber == 1){
    6. [xmlcont loadXMLbyURL:@"page2.xml"];
    7. }
    Alles anzeigen



    ganz einfach aus dem Grund, dass er jedes mal wenn er in die ViewDidLoad methode geht, was er ja tut, wenn er eine neue Seite aufbaut,
    allociert er den Speicher neu, das führt zu nem Leak und dass dazu, dass man nicht auf die Methoden die man dem Nib-File zugewiesen hat
    zugreifen kann.
  • AR.DDev schrieb:

    Quellcode

    1. xmlcont = [XMLController alloc];

    ist sicher so nicht richtig. Erstens fehlt release, zweitens wo ist init?
    der release ist in der dealloc methode, da ichs nicht kopiert hab sondern händisch geschrieben hab, fehlt das init ;).

    Sag mal, wenn ich im Tabbar auf den Tab geht der den ScrollView lädt, dann sehe ich zwar die UIPageControl aber den View nicht,
    erst wenn ich wische lädt er den view, weißt du an was das liegen kann?
  • Pretime schrieb:

    AR.DDev schrieb:

    Quellcode

    1. xmlcont = [XMLController alloc];

    ist sicher so nicht richtig. Erstens fehlt release, zweitens wo ist init?
    der release ist in der dealloc methode, da ichs nicht kopiert hab sondern händisch geschrieben hab, fehlt das init ;).

    Sag mal, wenn ich im Tabbar auf den Tab geht der den ScrollView lädt, dann sehe ich zwar die UIPageControl aber den View nicht,
    erst wenn ich wische lädt er den view, weißt du an was das liegen kann?
    habs schon:

    Quellcode

    1. [self loadScrollViewWithPage:0];[self loadScrollViewWithPage:1];



  • Brauchst Du das Objekt außerhalb der Methode, wo Du es erzeugst? Wenn ja, mach Dir 'ne Property dafür und benutze Setter und Getter. Wenn nein, dann gibt das Objekt noch innerhalb der Methode frei. Am Besten, in dem Du bei der Erzeugung gleich noch ein autorelease dran hängst. Das musst Du sowieso bei Verwendung von Setter und Getter für den ersten Fall.

    Michael