UITabBarController in eine SingleView App integrieren

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

  • UITabBarController in eine SingleView App integrieren

    Hallo,
    habe da so ein Problem, möchte in einer View eine Tabbar anzeigen und drüber eben die Views.
    Soweit so schön ...
    Was ich bis dato gemacht habe ist folgendes
    SingleView App
    Im ViewController habe ich gesagt das dieser ein TabbarDelegate besitzt.
    Auch das soweit so gut. Nun noch 2 Screens mit jeweiligen Controllern angelegt.
    2 Tabbar Items rein, Title und Tag gesetzt
    Auch schick.
    Nun mittels switch Case geprüft welches Icon gedrückt wird :
    so sieht das derzeit aus :
    -(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
    {
    NSLog(@"just presed %d", item.tag);
    NSLog(@"just presed %@", item.title);
    switch (item.tag) {
    case 0:
    [self showFavController];
    break;
    case 1:
    [self showmoreController];
    break;

    default:
    break;
    }

    }
    die beiden Funktionen sehen so aus :
    -(void)showFavController
    {
    FTFavViewController *myfav =[self.storyboard instantiateViewControllerWithIdentifier:@"Fav"];
    [self.view insertSubview:myfav.view aboveSubview:self.myTabBar];

    }

    Nun stehe ich jedoch vor zwei Problemen.
    1)
    Er öffnet mir die View, jedoch wird die Links neben beginnend gezeichnet und geht bis Mitte vom Screen.
    2)
    Drücke ich nun auf das 2. Item, so wird der erste Screen nicht etwa nach hinten gelegt, sondern bleibt im Vordergrund :)
    Kann mir jemand helfen ?
  • Hallo,
    weil ich den Tabbar unten mittig starten lassen will und am Screen rechts enden. Habe links davon diverse Eingabe Möglichkeiten.
    Der Screen ist gob gesagt 3 geteilt.
    Links oben eine Liste mit Elementen. Darunter Eingabe Elemente und Rechts hätte ich eben gerne diese Tabbar ?
    Oder habe ich deine Frage falsch verstanden ?
  • Auch wenn der Name es suggeriert, passt die Methode insertSubview:aboveSubview: nicht die Größe oder Position des übergebenen Views an. Du musst den Frame des Views so setzen, dass er genau an die Stelle passt, wo Du ihn hinhaben willst. Das geht am einfachsten, wenn Du einen leeren View genau an der Stelle im Storyboard anlegst und den über ein Outlet mit seinem Controller verbindest. Den Wechsel machst Du dann so:

    Quellcode

    1. [self.containerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    2. [self.containerView addSubview:myFav.view];
    3. myFav.view.frame = self.containerView.bounds;

    Außerdem solltest Du Dir mal Apples Hinweise zu Container-Viewcontrollern ansehen: developer.apple.com/library/io…c/uid/TP40006926-CH3-SW81
    „Meine Komplikation hatte eine Komplikation.“
  • Halo,
    soweit klappt das nun Danke dafür.
    Nun habe ich ein Effekt den ich nicht ganz verstehe und finde auch keinen Fehler und keinen Ansatz wo ich uchen kann.
    Also der Screen geht auf. Im Screen ist eine Collection View. Die auch mit Daten gefüllt ist. Prima.
    Sobald ich darin Scrolle, schmiert das System einfach ab. Steht dann in der Main Funktion.
    Sowohl delegate als auch Datasource sind gesetzt. Diese werden auch bei "zeichnen des Screens erstmalig angesprungen!
    Im Controller selbst wird vor dem Absturz die Funktion collectionView: cellForItemAtIndexPath:indexPath jedoch nicht angesprungen.
    Kann mir jemand helfen den Fehler einzugrenzen ?
    Bin für jede Hilfe dankbar.
  • Hallo,
    also in der Debug Console steht nix, auch nach aktivieren der Exeptions steht nix in der Console.
    Als ich den Stacktrace nun mittels des Schiebereglers nach Links bewegt habe, konnte kann ich erkennen das die letzte Funktion die er ausführt ein
    scrollviewwillbegindragging ist.


    Ich habe grade mal eine Exeption gesehen ...
    -[UITableViewCellScrollView collectionView:cellForItemAtIndexPath:]:
    Aber ... warum wird die geworfen. das sieht ja fast so aus, als wäre das Delegate falsch ?!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von derfranzose2 ()

  • Ich tippe jetzt einfach mal auf einen Fehler beim Speicher Management, sprich ein Objekt für den Inhalt der Collection View steht nicht mehr zur Verfügung.

    Poste doch bitte mal den Code, mit dem die Daten für den Collection View erzeugt werden. Da sollte sich der Fehler ggf. lokalisieren lassen.
  • Hallo,
    ich würde aber sagen, wenn das so wäre, würde er doch wenigstens in die Funktion reinspringen
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    Oder sehe ich das falsch. Also ich will an der Stelle nur verstehen wie du darauf kommst ( klar wahrscheinlich Erfahrung :-))

    Also es handelt sich bei meinen Daten um den Inhalt eines Singletons.
    Dieses liefert eben ein Array mit Daten zum Anzeigen zurück.
    Die Daten werden auch nicht gelöscht. Die einzige Funktion die Daten in dem Singelton löscht habe ich bereits mit Debugs versehen.

    Quellcode

    1. - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
    2. {
    3. NSInteger result = 0;
    4. if ([collectionView.restorationIdentifier isEqualToString:@"FGROUPS"])
    5. {
    6. result =[[FTFGroupList getFGroupList] count];
    7. }
    8. return result;
    9. }

    Das ist der eine ...
    hier der 2.

    Quellcode

    1. - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. FTUICollectionViewCell *mycell;
    4. if ([collectionView.restorationIdentifier isEqualToString:@"FGROUPS"])
    5. {
    6. mycell = [collectionView dequeueReusableCellWithReuseIdentifier:@"selectedFGroup" forIndexPath:indexPath];
    7. NSString *labeltext = [[[FTFGroupList getFGroupList]objectAtIndex:indexPath.row] description];
    8. mycell.textLabel.text = labeltext;
    9. }
    10. return mycell;
    11. }
    Alles anzeigen



    kleiner Nachtrag
    Ich habe nun mal ein Array angelegt, und darin einfach 20 Objekte Gelegt ( Strings ) diese dann dem entsprechend bei dem beiden Funktionen hinter legt.
    Sobald ich auf eine Celle Tippe oder aber versuche zu scrollen stürzt die App ohne jegliche Meldung ab.
    Stack Trace und Debug Console zeigen keinerlei verwertbare Infos.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von derfranzose2 ()

  • Da war meine Vermutung mit dem Fehler beim Speicher Management doch richtig. Wobei ich eher ein Problem bei den Daten und nicht beim ViewController vermutet hätte. ;)

    Quellcode

    1. -(void)showExampleData
    2. {
    3. FTUIExampleController *artController = [self.storyboard instantiateViewControllerWithIdentifier:@"artcontroller"];
    4. [self.containerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    5. [self.containerView addSubview:artController.view];
    6. artController.view.frame = self.containerView.bounds;
    7. }

    Was passiert wohl mit dem FTUIExampleController am Ende der o.a. Methode?

    Mit dem Hinweis von Clemens

    macmoonshine schrieb:

    Außerdem solltest Du Dir mal Apples Hinweise zu Container-Viewcontrollern ansehen: developer.apple.com/library/ios/…006926-CH3-SW81
    solltest Du den Fehler eigentlich finden.
  • Sorry,
    Mensch bin ich Blöd ... Danke.
    Darf ich noch fragen ob der Lösungsansatz der korrekte ist ?
    Ich habe nun ein proberty angelegt und weise dann in der showExampleData auf das Proberty.
    also 2 Änderungen
    @property (strong,nonatomic) FTUIExampleController *mycontainer;


    -(void)showExampleData
    {
    self.mycontainer = [self.storyboard instantiateViewControllerWithIdentifier:@"artcontroller"];
    [self.containerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    [self.containerView addSubview:self.mycontainer.view];
    self.mycontainer.view.frame = self.containerView.bounds;

    }
    Oder ist das der verkehrte Weg ?