我无法在SO上找到问题的答案,如果答案已存在,请与我联系!我的问题似乎很常见 - 我在导航控制器中嵌入了一个tableview,我想要一个包含3个项目的标签栏,其中3个项目更改tableview以填充不同的数据,第一个选项卡表示tableview中的默认数据已加载。
但是,当我只使用一个简单的[tableView reloadData]
来改变填充表的数据时,似乎没有必要为其他两个选项卡创建两个额外的UITableViewController类。你如何做到这一点,以及如何在故事板中实现这一点?
答案 0 :(得分:3)
听起来你真正想要的是一个带有分段控制的UITableViewController来改变视图.Tab Bars用于导航。
使用UIControlEventValueChanged检测更改,加载新数据并重新加载视图。
您没有说明“不同数据”的含义。如果您的意思是执行一些通过CoreData fetch / predicate / sort等更新数据的操作,那么使用Segmented Control可能就是这样。如果您的数据有很大的不同(不同的实体,不同的数据管理等),那么您应该使用单独的UITableViewControllers,因为您不应该尝试过度概括UITableViewController,而是将数据与UITableViewController配对。毕竟,这就是它的用途。
答案 1 :(得分:1)
您可以做的是重复使用相同的类,并检查viewDidLoad
方法以确定如何填充tableView
,例如:
- (void)viewDidLoad{
//itemType is a property you set
//when instantiating the controller
int index = self.itemType;
switch (index) {
case 0:
[self populateTab1];
break;
case 1:
[self populateTab2];
break;
case 2:
[self populateTab3];
break;
default:
break;
}
}
答案 2 :(得分:1)
在storyboard中,将UITabbar
添加到表视图控制器中。不要使用UITabbarViewController
作为视图控制器的容器。另一方面,UITabbar
只是一个控制单元。
将选项卡栏的委托设置为表视图控制器,并添加以下协议方法:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
您可以在此方法中加载正确的数据。您可以通过
获取所选项目(按钮)的索引NSUInteger index = [tabBar.items indexOfObject:item];
答案 3 :(得分:1)
您可以使用ctrl + drag这样将多个关系转换为一个控制器。
storyboard> 5 times ctrl+drag to one Navigation Controller
你应该让CustomTabBarController.swift来修改标签。 不要忘记更改在故事板中绘制的TabBarController的类名。
class CustomTabBarController: UITabBarController {
let MENUS = ["tab1", "tab2", "tab3", "tab4", "tab5"]
override func viewDidLoad() {
super.viewDidLoad()
let items = tabBar.items!
for (var idx=0; idx<items.count; idx++) {
items[idx].title = MENUS[idx]
items[idx].tag = idx
}
}
...
}
您可以在ViewController.swift
上使用标签或选定的标签索引let tag = self.tabBarController?.tabBar.selectedItem!.tag
let selectedIndex = self.tabController?.selectedIndex