我在iPad应用中有一个带有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
,以确保内容可以在标签栏下滚动。您需要确保最底部的项目仍可以在底部标签栏上方向上滚动:
在Superview
中禁用自动内容插入调整:
tableView.contentInset
在适当的位置调整collectionView.contentInset
,添加以下方法,然后在viewDidLoad()
中调用它,或者在每次视图在tableView.contentInsetAdjustmentBehavior = .never
中布局时(如有必要)调用它。 (如果UIScrollView.contentInset
对您来说还为时过早,那么viewDidLoad()
可能也为时过早。)
viewDidLayoutSubviews()