与单个 UITabbar 项目的多个关系 iOS / Objective-C?

Multiple Relationships to one single UITabbar Item iOS / Objective-C?

有谁知道单个标签栏项目是否可以有多个关系?

我希望能够从一个 UITabbar 图标定向到两个不同的视图控制器,具体取决于登录的用户类型。

例如,如果用户以用户类型 "A" 登录,我希望选项卡栏图标指向配置文件视图控制器。如果用户以用户类型 "B" 登录,我希望相同的图标指向设置视图控制器。

我尝试将额外的视图控制器连接到标签栏,它只是在标签栏上创建了一个额外的 icon/tab。

您需要从代码中完成,因此请查看 setViewControllers 方法。

假设您有 4 个标签对应于 vc1 vc2 vc A or Bvc4...

您可以确定要分配的 VC,然后实例化完整的 "set" 控制器:

// set "vcA" as the 3rd tab
[self.tabBarController setViewControllers:@[vc1, vc2, vcA, vc4] animated:NO];

// or, set "vcB" as the 3rd tab
[self.tabBarController setViewControllers:@[vc1, vc2, vcB, vc4] animated:NO];

或者...节省 "manually" 实例化控制器...

您可以在故事板中分配所有 5 个控制器,然后:

// get the array of viewControllers
NSMutableArray *a = self.tabBarController.viewControllers;

// a now contains  [vc1, vc2, vcA, vcB, vc4]

// remove "vcA"
[a removeObjectAtIndex:2];

// or, remove "vcB"
[a removeObjectAtIndex:3];

// set the controllers array
[self.tabBarController setViewControllers:a animated:NO];

您还可以在该选项卡的视图控制器中放置一个容器视图,向容器视图添加两个视图,然后根据用户类型在 viewDidLoad 期间显示正确的视图。

有空再补代码

这是一种方法:

一个。跟踪持有变量的用户登录类型,从您之前的 viewController 传递或集中保存在数据对象中:

bool userCanAccessProfile = false;

乙。根据上面的布尔值,相应地更新您的布局和逻辑代码:

//layout your tab bar
UITabBar * tabBar = [UITabBar new];
tabBar.frame = CGRectMake(0, h-50, w, 50);
tabBar.delegate = self;
[self.view addSubview:tabBar];

//create the item(s)
UITabBarItem * item = [UITabBarItem new];
item.title = (userCanAccessProfile) ? @"Profile" : @"Settings";
item.image = (userCanAccessProfile) ? [UIImage imageNamed:@"profile.png"] : [UIImage imageNamed:@"settings.png"];
[tabBar setItems:@[item]];

上面的几行看起来像这样,意思是:

something = (isThisTrue) ? (true) setThisValue : (false) setAnotherValue;

你问的是 userCanAccessProfile 是否为真,如果是,你相应地设置了不同的文本和图像。

C。当用户点击该项目时,您将再次查询 bool 以找出要做什么:

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

    //when the item is clicked
    if (userCanAccessProfile){

        //open profile

    } else {

        //open settings
    }
}

一定要在.m文件中设置委托:

tabBar.delegate = self;

并在 .h 文件中添加委托:

@interface yourVC : UIViewController <UITabBarDelegate>