【问题标题】:Multiple Relationships to one single UITabbar Item iOS / Objective-C?与单个 UITabbar 项 iOS / Objective-C 的多个关系?
【发布时间】:2018-01-16 07:06:47
【问题描述】:

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

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

例如,如果用户以用户类型“A”的身份登录,我希望标签栏图标指向配置文件视图控制器。如果用户以用户类型“B”登录,我希望相同的图标指向设置视图控制器。

我尝试将附加视图控制器连接到选项卡栏,它只是在选项卡栏上创建了一个附加图标/选项卡。

【问题讨论】:

  • 您是否尝试纯粹使用 Storyboard 来实现这一目标?或者您是否在应用程序委托的 applicationDidFinish 启动方法中设置标签栏?另外,通过标签栏图标,您的意思是在点击标签的同时为 A 型或 B 型用户显示相同的图标吗?

标签: ios objective-c uitabbarcontroller uitabbar tabbar


【解决方案1】:

您需要从代码中执行此操作,因此请查看 setViewControllers 方法。

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

您可以确定要分配的 VC,然后使用以下命令实例化完整的“一组”控制器:

// 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];

或者...节省“手动”实例化控制器...

您可以在情节提要中分配所有 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];

【讨论】:

  • 谢谢你,DonMag!这运作良好。在您的第二个解决方案中,我只需要确保 self.tabBarController.viewControllers 是可变的,因为它最初是一个 NSArray。我是这样做的: NSMutableArray *a = [self.tabBarController.viewControllers mutableCopy];
【解决方案2】:

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

我有时间会添加代码。

【讨论】:

    【解决方案3】:

    这是一种方法:

    A.跟踪什么样的用户登录持有一个变量,从你以前的 viewController 传递,或者集中在一个数据对象中:

    bool userCanAccessProfile = false;
    

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

    //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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多