如何使用故事板将两个不同的Tab栏图标连接到同一个视图控制器?

时间:2013-02-20 14:49:57

标签: ios ipad uitabbarcontroller storyboard uistoryboard

我在iPad应用中有一个带有6个项目的标签栏控制器。当您点击它们时,其中两个图标将指向相同的视图控制器。此视图控制器具有将显示的项目列表,它将根据您点击的标签栏图标略有变化。

如何使用故事板进行设置?可以将关系拖动两次到同一个视图控制器,但它只是在标签栏上显示两个相同的图标。我希望这两个选择有不同的图标和名称。

6 个答案:

答案 0 :(得分:8)

就像你发现的那样,你可以在故事板中设计一次视图控制器,但不能多次将它与标签栏控制器相关联。

您可以做的是在身份检查器中为其分配标识符,然后在运行时,您可以使用方法-[UIStoryboard instantiateViewControllerWithIdentifier:]来实例化视图控制器的第二个副本。您可以使用-[UITabBarController setViewControllers:animated:]

将第二个副本插入选项卡控制器

答案 1 :(得分:1)

我相信你最好创建两个独立的视图控制器并将它们单独放在Tab Bar Controller中,特别是如果它们要加载不同的数据。您可以将相同的视图控制器多次放入标签栏控制器,但是就设计而言以及如何操作它,以这种方式进行操作没有多大意义。

答案 2 :(得分:1)

我有类似的问题并且很容易解决。

在故事板中创建一个TabBarController。

在每个标签中指定导航控制器。

将所有导航控制器设置为Root View Controller,以便在它们之间共享一个视图控制器。

在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

}

答案 3 :(得分:0)

我认为你不能做你想用UITabBarController做的事情。如果需要,可以添加同一视图控制器类的两个不同实例。否则,您必须向常规UIViewController添加标签栏,并编写自己的逻辑以在控制器之间切换。

答案 4 :(得分:0)

我能够通过在viewDidLoad中设置选项卡标题来实现。我创建了2个关系到同一View Controller。然后,将“条项目标题”设置为“未设置”。最后,我将viewDidLoad方法设置如下:

  UITabBarController *tc = (UITabBarController *)self.parentViewController;
  NSArray *vcs = tc.viewControllers;
  BOOL tabsInitialized=YES;
  for (UIViewController *vc in vcs)
  {
    if ([vc.tabBarItem.title isEqualToString:@"Not Set"])
    {
      tabsInitialized = NO;
      break;
    }
  }
  if (!tabsInitialized)
  {
    int I=1;
    for (UIViewController *vc in vcs)
    {
      vc.tabBarItem.title = [NSString stringWithFormat:@"Tab %i", i++];
    }
  }
}

答案 5 :(得分:0)

我知道这个问题已经回答了一段时间,但是没有提到使用直接使用UITabBar并覆盖其UITabBarDelegate tabBar(:,didSelect item:)方法而不是使用{{1} }间接处理选择。

UITabBarController

通过直接覆盖extension MyListViewController: UITabBarDelegate { func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { // Set some filter based on the selected item or its tag (tag values can be assigned in IB) switch item.tag { // Apply filter to your datasource based on the item.tag } // Or if you are using a CoreData NSFetchedResultsController, set its predicate: // resultsController.predicate = makePredicate(item.tag) // resultsController.performFetch() tableView.reloadData() } } 方法,您可以直接控制选项卡的选择行为。因此,您可以重复使用UITabBarDelegate的相同实例,而不是UIViewController坚持为每个选项卡创建UITabBarController的新实例。例如,在UIViewController方法中,您可以将过滤器应用于didSelect中现有的项目列表,而不必在新的UITableView中创建列表的新实例。解决方案。

注意:如果您在代码或IB中的视图控制器中使用UITableView,则UIKit似乎无法识别其存在并“重叠”滚动视图(例如{{1 }},UITabBar)不会自动调整其UITableView。如果将UICollectionView的底部锚定到安全区域边缘不为零的设备上,则也无法正确地将其固定在安全区域边距为非零的设备上(它似乎“浮动”,并且之间有一个间隙本身和屏幕边缘)。

解决方案(第1部分):contentInset实例上专门设置顶部约束:首先将标签栏的底部边缘锚定到{{ 1}}并将 top 边缘锚定到安全区域底部边缘,并将常数设置为49(常数的标准高度撰写本文时为UITabBar)。然后,在具有和没有安全区域余量的设备上,它看起来都是正确的。

解决方案(第2部分):您将需要并手动调整UITabBar / UITabBar,以确保内容可以在标签栏下滚动。您需要确保最底部的项目仍可以在底部标签栏上方向上滚动:

  1. Superview中禁用自动内容插入调整:

    tableView.contentInset
  2. 在适当的位置调整collectionView.contentInset,添加以下方法,然后在viewDidLoad()中调用它,或者在每次视图在tableView.contentInsetAdjustmentBehavior = .never 中布局时(如有必要)调用它。 (如果UIScrollView.contentInset对您来说还为时过早,那么viewDidLoad()可能也为时过早。)

    viewDidLayoutSubviews()