我有一个iPad应用程序中的标签栏控制器6项。当你点击它们时,两个图标会导致相同的视图控制器。这个视图控制器有一个它将显示的项目列表,它会稍微改变,这取决于你点击哪个标签栏图标。如何将两个不同的标签栏图标连接到与故事板相同的视图控制器?
我如何设置故事板?它可能将两次关系拖到相同的视图控制器,但它只是在标签栏上显示两个相同的图标。我想让这两个选择有不同的图标和名称。
我有一个iPad应用程序中的标签栏控制器6项。当你点击它们时,两个图标会导致相同的视图控制器。这个视图控制器有一个它将显示的项目列表,它会稍微改变,这取决于你点击哪个标签栏图标。如何将两个不同的标签栏图标连接到与故事板相同的视图控制器?
我如何设置故事板?它可能将两次关系拖到相同的视图控制器,但它只是在标签栏上显示两个相同的图标。我想让这两个选择有不同的图标和名称。
就像您发现的那样,您可以在故事板中设计一次视图控制器,但不能将其与标签栏控制器多次关联。
您可以做的是在身份检查器中为其分配标识符,然后在运行时您可以使用方法-[UIStoryboard instantiateViewControllerWithIdentifier:]实例化视图控制器的第二个副本。您可以使用-[UITabBarController setViewControllers:animated:]
我相信你最好创建两个独立的视图控制器,并将它们分别放置在Tab Bar Controller中,特别是如果它们要加载不同的数据。您可以将同一视图控制器多次放置到Tab Bar Controller中,但就设计和如何操作而言,这样做并不合理。
我不认为你可以做你想用UITabBarController做什么。如果需要,您可以添加两个不同的相同视图控制器类的实例。否则,你将不得不添加一个标签栏到常规的UIViewController,并编写自己的逻辑在控制器之间切换。
将第二个副本插入到选项卡控制器中当我尝试实现带有4个选项卡项目的标签栏控制器视图以及每个选项卡项目重复使用相同的视图控制器时,当标签栏控制器调用viewDidLoad
时,这4个项目的自定义逻辑通过属性设置。让我告诉你,我已经按以下步骤进行:
1. 4个视图控制器
打开故事板创建一个标签栏控制器,并从对象库拖动Tab Bar Controller
。再将另外两个view controller
拖放到故事板上。
请记住在标签栏控制器和2个新视图控制器之间进行链接。
2. 4标签视图
创建一个新的可可触摸类,名为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的视图控制器子类
创建一个新的可可触摸类,命名为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
@实施部分:
- (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];
}
}
我有一个类似的问题,很容易解决它。
在Storyboard中创建一个TabBarController。
在每个选项卡中分配一个导航控制器。
将所有导航控制器设置为根视图控制器,您希望在它们之间共享一个视图控制器。
在您的View Controller中,在ViewDidLoad中,根据tabBarController.selectedIndex创建一个条件,以根据选定的选项卡自定义视图控制器。类似这样的:
override func viewDidLoad() {
super.viewDidLoad()
if let selectedTabIndex = tabBarController?.selectedIndex {
switch selectedTabIndex:
case 0: // Customize ViewController for tab 1
case 1: // Customize ViewController for tab 2
case 2: // Customize ViewController for tab 3
default: break
}
它的数据相同,只是一个不同的子集。所以他们会看起来像100%一样 – hakonbogen 2013-02-20 16:12:29
了解,但标签栏控制器实际上只是用来选择不同的视图控制器,而不是数据的子集。 – JMarsh 2013-02-20 16:15:41