如何连接两个不同的标签栏图标到故事板的相同的视图控制器?
我有一个iPad应用程序中的标签栏控制器6项。 其中两个图标会在您点击时导致相同的视图控制器。 这个视图控制器有一个它将显示的项目列表,它会稍微改变,取决于你点击哪个标签栏图标。
我如何设置故事板? 它可能拖两次关系到相同的视图控制器,但它只是在标签栏上显示两个相同的图标。 我想要两个select有不同的图标和名称。
就像您发现的一样,您可以在故事板中devise一次视图控制器,但不能将其与标签栏控制器关联多次。
你可以做的是在身份检查器中为它分配一个标识符,然后在运行时你可以使用方法- [UIStoryboard instantiateViewControllerWithIdentifier:]来实例化视图控制器的第二个副本。 你可以使用- [UITabBarController setViewControllers:animated:]将第二个副本插入到选项卡控制器中
我相信你最好创build两个独立的视图控制器,并将它们分别放置在Tab Bar Controller中,特别是如果它们要加载不同的数据。 您可以将同一个视图控制器放置在多个Tab Bar Controller中,但是就devise而言以及如何操作它来说,这样做没有什么意义。
当我试图实现带有4个选项卡项目的标签栏控制器视图,并且每个选项卡项目重用相同的视图控制器时,我得到了与您的问题相同的问题,并且这些4项目的自定义逻辑通过属性设置时,选项卡栏控制器调用viewDidLoad
。 让我告诉你我做了什么,如下所示:
1.使用4个视图控制器创build一个选项卡栏控制器
打开故事板,并从对象库中拖动一个Tab Bar Controller
。 再把另外两个view controller
拖到故事板上。
请记住在标签栏控制器和2个新的视图控制器之间进行连接。
2.为4选项卡视图创build一个重用视图控制器
创build一个名为ViewController
的新cocoa触摸类,并在@interface部分创build自定义属性。 这些属性将在标签栏控制器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.创buildUITabBarController的视图控制器子类
创build一个名为UITabViewController
的新的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]; } }]; }
或者,如果您需要在用户select不同的选项卡项目时设置自定义属性,则可以在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]; } }
我不认为你可以做你想要做的与UITabBarController。 如果需要,可以添加两个不同的相同视图控制器类的实例。 否则,你将不得不添加一个标签栏到一个普通的UIViewController,并编写自己的逻辑在控制器之间切换。
我有一个类似的问题,很容易解决。
在Storyboard中创build一个TabBarController。
在每个标签中分配一个导航控制器。
将所有导航控制器设置为根视图控制器中您希望在它们之间共享的视图控制器。
在您的View Controller中,在ViewDidLoad中,根据tabBarController.selectedIndex创build一个条件,以根据选定的选项卡自定义视图控制器。 像这样的东西:
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 }