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];
}
}