iOS - 在这个适应性布局时代,是否仍然可以向UITabBarController动态添加项目?

时间:2018-04-24 12:23:55

标签: ios objective-c xcode

我有一个与外部实体通信的应用。如果该实体的开关打开或关闭,我需要在标签栏上显示或隐藏项目。

如果用户从实体A更改为实体B并且具有不同的设置,则必须是动态的。标签栏项目需要显示/隐藏,如果他们切换和设置不同。

我曾经在UITabBarController中添加一个项目,如下所示:

UIViewController *vc1 = [[MyViewController1 alloc] init];
[self.tabBarController addChildViewController:vc1];

UIViewController *vc2 = [[MyViewController2 alloc] init];
[self.tabBarController addChildViewController:vc2];

我可以从标签栏中删除项目,如下所示:

    NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
    [tbViewControllers removeObjectAtIndex:4];
    [tbViewControllers removeObjectAtIndex:4];
    [self.tabBarController setViewControllers:tbViewControllers];

在我的ViewController代码中我有这样的东西:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization

        //get the tab bar item
        UITabBarItem *tbi = [self tabBarItem];

        //give it a label
        [tbi setTitle:@"Tab Item"];

        //create a UIImage from a file
        UIImage *i = [UIImage imageNamed:@"image.png"];

        //put that image on the tab bar item
        [tbi setImage:i];
    }
    return self;
}

现在,随着自适应应用程序布局和segues的出现,似乎动态添加项目不起作用。至少对我而言。

我得到一个黑色的屏幕,而不是我希望在做上述操作时看到的视图。有问题的UIView基本上是一个UIWebView,上面有几个自定义按钮。

我的应用程序是完全自适应布局,与UIStackViews兼容。

在现代自适应布局之前,我在这里看到的所有帖子都引用了UITabBars中的添加或删除项目都已有几年了。

是否仍然可以在标签栏中添加/删除标签项?这样做是否可取或现在是不好的做法?

要实现同一目标的任何其他想法,如果根据外部设置在标签栏上设置项目?

干杯,

TJ

1 个答案:

答案 0 :(得分:0)

我找到了自己的解决方案,并分享它以帮助他人。

诀窍是如何创建UIViewController。

执行此操作的新方法是通过从故事板中实例化来创建视图控制器。

我从this question找到了这个想法。

创建和添加TabView的方式如下:

// Get a reference to the Tab View Controllers array
NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];

// Get a reference to the storyboard                    
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];

// Instantiate a new instance of the ViewController
UIViewController *vc1 = [sb instantiateViewControllerWithIdentifier:@"MyVC"];

// Add the new view controller to the array at the desired location
[tbViewControllers insertObject:vc1 atIndex:tbViewControllers.count-1];

// Set the tab bar controllers to the newly augmented array
[self.tabBarController setViewControllers:tbViewControllers];

就是这样。视图控制器按照我的预期工作。没有黑屏。

希望这有助于其他人。