Ios 具有多个选项卡的选项卡栏,仅使用一个视图控制器

Ios 具有多个选项卡的选项卡栏,仅使用一个视图控制器,ios,objective-c,uitabbarcontroller,uitabcontroller,Ios,Objective C,Uitabbarcontroller,Uitabcontroller,我无法找到我的问题的答案,所以,如果某个地方已经有答案,请与我联系!我的问题似乎很常见-我在导航控制器中嵌入了一个tableview,我想要一个包含3项的选项卡栏,其中3项更改tableview以填充不同的数据,第一个选项卡表示加载视图时tableview中的默认数据 但似乎没有必要为其他两个选项卡创建两个额外的UITableViewController类,因为我只需通过一个简单的[tableView reloadData]更改填充表的数据即可。你是如何做到这一点的,以及如何在故事板中实现这一点

我无法找到我的问题的答案,所以,如果某个地方已经有答案,请与我联系!我的问题似乎很常见-我在导航控制器中嵌入了一个tableview,我想要一个包含3项的选项卡栏,其中3项更改tableview以填充不同的数据,第一个选项卡表示加载视图时tableview中的默认数据


但似乎没有必要为其他两个选项卡创建两个额外的UITableViewController类,因为我只需通过一个简单的
[tableView reloadData]
更改填充表的数据即可。你是如何做到这一点的,以及如何在故事板中实现这一点的

您可以重复使用同一类,并在
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;
    }


}

在情节提要中,将
UITabbar
添加到表视图控制器中。不要使用作为视图控制器容器的
UITabbarViewController
。另一方面,
uitabar
只是一个控制单元

将选项卡栏的委托设置为表视图控制器,并添加以下协议方法:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
您可以在此方法中加载正确的数据。您可以通过以下方式获取所选项目(按钮)的索引:


听起来您真正想要的是一个带有分段控件的UITableViewController来更改视图。选项卡栏用于导航

使用UIControlEventValueChanged检测更改,加载新数据并重新加载视图


您没有指出“不同数据”的含义。如果您的意思是执行一些通过CoreData获取/谓词/排序等更新数据的操作,那么使用分段控件可能是一种方法。如果您的数据存在显著差异(不同的实体、不同的数据管理等),那么您可能应该使用单独的UITableViewController,因为您不应该尝试过度概括UITableViewController,而应该将数据与UITableViewController配对。毕竟,这就是它的用途。

您可以像这样通过ctrl+drag将多个关系切换到一个控制器

您应该使用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
        }
    }
...
}

为什么要使用选项卡栏控制器来筛选表视图的数据?对不起,我不是指筛选,我是指更改!我的应用程序显示Facebook页面上的照片。相册有3个类别,我希望3个选项卡代表类别,而tableView显示类别中的相册。然后您需要三个视图控制器实例,但只有一个视图控制器类。只需将类别传递给类,以便视图控制器知道要显示哪些图像。您能给我一些代码示例吗?这并不理想。您正在强制视图控制器知道1)它位于选项卡控制器中,2)它的数据依赖于选定的选项卡。只需在视图控制器上设置一些属性,告诉它要使用哪个数据集,效果会好得多。这将使代码与特定布局的耦合性大大降低。你是对的@rmaddy这违反了关注分离这只是我的第一个想法,我将编辑它死链接-从2018年6月开始,尝试-或者,如果没有了,搜索术语
人机界面指南分段控件
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
        }
    }
...
}
let tag = self.tabBarController?.tabBar.selectedItem!.tag

let selectedIndex = self.tabController?.selectedIndex