3 Stimmen

Wie verbinde ich zwei verschiedene Tab-Leistensymbole mit demselben Ansichtscontroller mit Storyboard?

Ich habe einen Tab-Bar-Controller in einer iPad-App mit 6 Elementen. Zwei der Symbole werden, wenn Sie darauf tippen, zu demselben Ansichtscontroller führen. Dieser Ansichtscontroller hat eine Liste von Elementen, die er anzeigen wird, die sich je nachdem, auf welches der Tab-Bar-Symbole Sie getippt haben, leicht ändern werden.

Wie richte ich das mit Storyboards ein? Es ist möglich, die Beziehung zweimal zum selben Ansichtscontroller zu ziehen, aber dann werden einfach zwei identische Symbole in der Tab-Leiste angezeigt. Ich möchte, dass die beiden Auswahlmöglichkeiten unterschiedliche Symbole und Namen haben.

8voto

Jon Hess Punkte 14197

Wie Sie herausgefunden haben, können Sie den Ansichtscontroller einmal im Storyboard entwerfen, aber ihn nicht mehr als einmal mit dem Tab-Controller verknüpfen.

Was Sie tun können, ist ihm im Identitätsinspektor einen Bezeichner zuzuweisen und dann zur Laufzeit die Methode -[UIStoryboard instantiateViewControllerWithIdentifier:] zu verwenden, um eine zweite Kopie des Ansichtscontrollers zu instanziieren. Sie können diese zweite Kopie in den Tab-Controller einfügen, indem Sie -[UITabBarController setViewControllers:animated:] verwenden

1voto

JMarsh Punkte 924

Ich glaube, du bist besser dran, zwei separate Ansichts-Controller zu erstellen und sie individuell in den Tab Bar Controller zu platzieren, insbesondere wenn sie unterschiedliche Daten laden. Du kannst denselben Ansichts-Controller mehrmals in einen Tab Bar Controller platzieren, aber in Bezug auf das Design und wie du es manipulieren kannst, ergibt es nicht viel Sinn, es auf diese Weise zu tun.

1voto

Enix Punkte 4169

Als ich versuchte, eine Tab-Leiste-Controller-Ansicht mit 4 Registerkartenpunkten zu implementieren und jede Registerkarte die gleiche Ansichts-Controller wiederverwendet und die benutzerdefinierte Logik für diese 4 Elemente über die Eigenschaft gesetzt wird, wenn der Tab-Leisten-Controller viewDidLoad aufruft. Lass mich zeigen, was ich gemacht habe:

1. Erstellen eines Tab-Leisten-Controllers mit 4 Ansichts-Controllern

Öffne das Storyboard und ziehe einen Tab-Bar-Controller aus der Objektbibliothek. Ziehe dann weitere 2 Ansichtscontroller in das Storyboard.

Vergiss nicht, eine Verknüpfung zwischen dem Tab-Leisten-Controller und den 2 neuen Ansichtscontrollern herzustellen.

2. Erstellen eines wiederverwendbaren Ansichts-Controllers für die 4 Tab-Ansichten

Erstelle eine neue Cocoa-Touch-Klasse mit dem Namen ViewController und erstelle deine Anpassungseigenschaften im @interface-Bereich. Diese Eigenschaften werden in der viewDidLoad-Methode des Tab-Leisten-Controllers festgelegt, sodass die 4 Tab-Ansichten denselben Ansichts-Controller verwenden, aber die Eigenschaften nicht gleich sind.

#import 

@interface ViewController : UIViewController 

// Definiere hier deine Anpassungseigenschaften, damit du sie im Tab-Leisten-Controller setzen kannst.
@property (assign, nonatomic) UITableViewCellStyle style;

@end

4. Erstellen einer Ansichtscontroller-Unterklasse von UITabBarController

Erstelle eine neue Cocoa Touch-Klasse mit dem Namen UITabViewController und mache sie zur Unterklasse von UITabBarController und konform zu UITabBarControllerDelegate.

In meinem Fall muss ich eine Tabellenansicht mit 4 verschiedenen Zellstilen in 4 verschiedenen Registerkarten anzeigen, daher werde ich die style-Eigenschaft des viewController im Tab-Leisten-Controller setzen, um mein Ziel zu erreichen.

UITabViewController.h

#import 

@interface UITabViewController : UITabBarController 
@end

UITabViewController.m

#import "UITabViewController.h"

@interface UITabViewController ()

@end

@implementation UITabViewController

- (void)viewDidLoad {
    // Mache UITabViewController zum Delegaten von UITabBarController
    self.delegate = self;

    [super viewDidLoad];

    // Richte den Zellenstil der Tabelle für jedes Registerkartenelement ein
    [self.viewControllers enumerateObjectsUsingBlock:^(id viewController, NSUInteger idx, BOOL *stop){
        UITableViewCellStyle style;
        switch (idx) {
            case 0:
                style = UITableViewCellStyleDefault;
                break;
            case 1:
                style = UITableViewCellStyleSubtitle;
                break;
            case 2:
                style = UITableViewCellStyleValue1;
                break;
            case 3:
                style = UITableViewCellStyleValue2;
                break;
            default:
                style = UITableViewCellStyleDefault;
                break;
        }

        SEL selector = @selector(setStyle:);

        if([viewController respondsToSelector:selector]){
            NSInvocation *invk = [NSInvocation invocationWithMethodSignature:[viewController methodSignatureForSelector:selector]];
            [invk setSelector:selector];
            [invk setTarget:viewController];

            [invk setArgument:&style atIndex:2];
            [invk invoke];
        }
    }];
}

Oder wenn du die Anpassungseigenschaften setzen musst, wenn der Benutzer verschiedene Registerkartenelement auswählt, dann kannst du eine neue Delegatemethode im UITabViewController @implementation-Bereich hinzufügen:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
    // Überprüfe, ob der Ansichtscontroller auf die Eigenschaftssetzungsmethode antwortet
    SEL selector = @selector(setMyProperty:);

    if([viewController respondsToSelector:selector]){
        // Rufe die Settermethode mit NSInvocation auf
        NSInvocation *invk = [NSInvocation invocationWithMethodSignature:[viewController methodSignatureForSelector:selector]];
        [invk setSelector:selector];
        [invk setTarget:viewController];

        [invk setArgument:&argument atIndex:2];
        [invk invoke];
    }
}

1voto

Felipe Ferri Punkte 3374

Ich hatte ein ähnliches Problem und habe es ziemlich einfach gelöst.

Erstellen Sie einen TabBarController im Storyboard.

Weisen Sie jedem Tab einen Navigation Controller zu.

Legen Sie alle Navigationscontroller als Root-View-Controller fest, den Sie zwischen ihnen teilen möchten.

Erstellen Sie in Ihrem View Controller in ViewDidLoad eine Bedingung basierend auf dem tabBarController.selectedIndex, um den View Controller je nach ausgewähltem Tab anzupassen. Etwas Ähnliches wie folgt:

override func viewDidLoad() {
    super.viewDidLoad()
    if let selectedTabIndex = tabBarController?.selectedIndex {
           switch selectedTabIndex:
           case 0: // View Controller für Tab 1 anpassen
           case 1: // View Controller für Tab 2 anpassen
           case 2: // View Controller für Tab 3 anpassen
           default: break

}

0voto

rdelmar Punkte 103832

Ich glaube nicht, dass Sie mit einem UITabBarController das tun können, was Sie versuchen zu tun. Sie können zwei verschiedene Instanzen derselben ViewController-Klasse hinzufügen, wenn Sie möchten. Andernfalls müssten Sie eine Tab-Leiste zu einem regulären UIViewController hinzufügen und Ihre eigene Logik zum Wechseln zwischen Controllern schreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X