4

我无法在 SO 上找到我的问题的答案,如果某个地方已经存在答案,请给我链接!我的问题似乎很常见-我在导航控制器中嵌入了一个表格视图,我想要一个带有 3 个项目的选项卡栏,其中 3 个项目更改表格视图以填充不同的数据,第一个选项卡表示视图时表格视图中的默认数据已加载。

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

4

4 回答 4

3

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

分段控制

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

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

于 2014-07-21T20:53:08.083 回答
2

您可以像这样使用 ctrl+drag 使多个关系与一个控制器保持一致。

故事板> 5 次 ctrl+拖动到一个导航控制器

你应该让 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
于 2016-02-11T09:56:24.067 回答
1

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

将标签栏的委托设置为您的表格视图控制器,并添加以下协议方法:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;

您可以在此方法中加载正确的数据。您可以通过以下方式获取所选项目(按钮)的索引

NSUInteger index = [tabBar.items indexOfObject:item];
于 2014-07-21T18:38:49.640 回答
1

您可以做的是重用相同的 Class 并检查您的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;
    }


}
于 2014-07-21T18:02:16.787 回答