使用一个视图控制器创建带有多个选项卡的标签栏。

4

我在SO上找不到解决我的问题的答案,请给我提供链接,如果已经有答案存在!我的问题似乎非常普遍 - 我在导航控制器中嵌入了一个表视图,并希望有一个带有3个选项卡的标签栏,在这3个选项卡中,第一个选项卡表示视图加载时表视图中的默认数据。

但是,当我可以通过简单的 [tableView reloadData] 更改填充表格的数据时,似乎没有必要为其他两个选项卡创建两个额外的UITableViewController类。您如何处理此问题?并且如何在故事板中实现它?


为什么要使用选项卡控制器来过滤表视图的数据? - rmaddy
抱歉,我不是指筛选,而是指更改!我的应用程序显示来自Facebook页面的照片。有3个相册类别,我希望3个选项卡代表这些类别,而tableView则显示该类别的相册。 - Gman9855
那么你需要三个视图控制器实例,但只有一个视图控制器类。只需将类别传递给类,以便视图控制器知道要显示哪些图像。 - rmaddy
你能给我一些代码示例吗? - Gman9855
4个回答

3

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

分段控件

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

你没有说明'不同的数据'是什么意思。如果你的意思是执行一些操作,通过CoreData获取/谓词/排序等更新数据,那么使用分段控制可能是正确的方法。如果你的数据差异很大(不同的实体,不同的数据管理等),那么你应该选择单独的UITableViewControllers,因为你不应该过度概括你的UITableViewController,而是将你的数据与UITableViewController配对。毕竟,这就是它的作用。


失效链接 - 截至2018年6月,请尝试人机界面指南>控件>分段控件 - 或者,如果该链接已失效,请搜索“人机界面指南分段控件”。 - leanne

2
你可以使用ctrl + 拖动来创建多重关系并将它们指向同一个控制器,就像这样。

在storyboard中,拖动5次以创建一个导航控制器

此外,你应该创建CustomTabBarController.swift文件以修改选项卡。别忘了在storyboard中也要修改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

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;
    }


}

1
这并不是最佳实践。你强迫视图控制器知道1)它在标签控制器中,2)它的数据取决于所选标签。更好的做法是简单地设置视图控制器上的某些属性来告诉它使用哪个数据集。这将使代码与特定布局的耦合度大大降低。 - rmaddy
你说得对,@rmaddy。这违反了关注点分离的原则。这只是我最初的想法,我会进行编辑。 - meda

1
在Storyboard中,将UITabbar添加到您的表视图控制器中。不要使用作为视图控制器容器的UITabbarViewController。另一方面,UITabbar只是一个控制单元。
将选项卡栏的委托设置为您的表视图控制器,并添加以下协议方法:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;

你可以在这个方法中加载正确的数据。你可以通过获取所选项目(按钮)的索引来完成。
NSUInteger index = [tabBar.items indexOfObject:item];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接