当我尝试使用 4 个选项卡项实现选项卡栏控制器视图时,我遇到了与您相同的问题,并且每个选项卡项都重用相同的视图控制器,并且这 4 个项目的自定义逻辑是通过属性设置的标签栏控制器调用viewDidLoad。让我向您展示我所做的如下:
1.创建一个带有 4 个视图控制器的标签栏控制器
打开故事板,从对象库中拖出Tab Bar Controller。并将另外 2 个view controller 也拖到故事板上。
记得在标签栏控制器和两个新的视图控制器之间建立一个链接。
2。为 4 选项卡视图创建重用视图控制器
创建一个新的 cocoa touch 类,命名为 ViewController,并在 @interface 部分创建自定义属性。这些属性会在标签栏控制器viewDidLoad方法中设置,所以4个标签视图会使用同一个视图控制器,但属性不一样。
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
// Define your customisation properties here, so that you can set it in the tab bar controller.
@property (assign, nonatomic) UITableViewCellStyle style;
@end
4.创建UITabBarController的视图控制器子类
创建一个新的 Cocoa Touch 类,命名为UITabViewController,并使其成为UITabBarController 的子类,并符合UITabBarControllerDelegate。
对于我的情况,我需要在 4 个不同的选项卡中显示具有不同 4 单元格样式的表格视图,因此我将在选项卡栏控制器中设置 viewController 的 style 属性以实现我的目标。
UITabViewController.h
#import <UIKit/UIKit.h>
@interface UITabViewController : UITabBarController <UITabBarControllerDelegate>
@end
UITabViewController.m
#import "UITabViewController.h"
@interface UITabViewController ()
@end
@implementation UITabViewController
- (void)viewDidLoad {
// Make UITabViewController as the delegate of UITabBarController
self.delegate = self;
[super viewDidLoad];
// Set-Up the UITableCell style for each tab item
[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];
}
}];
}
或者如果您需要在用户选择不同的选项卡项时设置自定义属性,那么您可以在UITabViewController@implementation 部分添加一个新的委托方法:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
// Check whether the view controller responds to the property setter method
SEL selector = @selector(setMyProperty:);
if([viewController respondsToSelector:selector]){
// Call the setter method with NSInvocation
NSInvocation *invk = [NSInvocation invocationWithMethodSignature:[viewController methodSignatureForSelector:selector]];
[invk setSelector:selector];
[invk setTarget:viewController];
[invk setArgument:&argument atIndex:2];
[invk invoke];
}
}