使用故事板更改UITabBarItem的图像

3
我有以下故事板:
如您所见,这是一个带有5个选项卡的标签栏应用程序,在Storyboard上,我为每个选项卡分配了徽标。现在,当用户在特定视图中单击单元格时,我想更改其中一个选项卡的图像。我该如何做?由于Storyboard已经为我完成了大部分工作,我没有选项卡视图控制器或项目的实例。因此,我的问题是我需要实现哪些方法来更改图像?如果我需要选项卡控制器,我如何获取它的实例,并将其指向哪个类?
非常感谢。
3个回答

2

在任何一个属于选项卡栏层次结构的UIViewController类中,您只需要执行以下操作即可获得选项卡控制器的实例:

//In UIViewController
UITabBarController *tabBarController = self.tabBarController;

你可以这样更改图片。
//Suppose you want to change the 1st (0th) tab bar image
UITabBarItem * tabItem = [tabBarController.tabBar.items objectAtIndex: 0];
tabItem.image = //whatever image you want to change to

1
不行,不可以这么做!从"tabBar"属性的文档中可以看到:"您绝不能尝试操作存储在此属性中的UITabBar对象。如果您尝试这样做,标签栏视图将抛出异常。要为选项卡栏界面配置项目,您应将一个或多个自定义视图控制器分配给viewControllers属性。选项卡栏从您指定的视图控制器中收集所需的选项卡栏项目。" - borrrden

2

每个UIViewController都有一个名为tabBarItem的属性,它是一个UITabBarItem,选项卡控制器使用它来设置代表该控制器的图像。 您可以操作它来更改所涉及控制器的图像。


0

我发现,在使用Swift的Xcode 6.1.1中,直接操作tabBarItem对我来说并不起作用。

然而,@borrrden的答案让我找到了正确的方向。UITabBarController的Apple文档非常清楚地说明:

您永远不应该直接访问选项卡栏控制器的选项卡栏视图。要配置选项卡栏控制器的选项卡,您需要将为每个选项卡提供根视图的视图控制器分配给viewControllers属性。

...

选项卡栏项目是通过它们对应的视图控制器进行配置的。要将选项卡栏项目与视图控制器关联,创建UITabBarItem类的新实例,根据视图控制器适当地配置它,并将其分配给视图控制器的tabBarItem属性。

因此,根据这一点,下面是我想出的对我有效的方法。

它是用Swift编写的,我希望未来的读者如果需要的话可以相应地翻译它(我还将图像名称更改为超级通用)。

我还使用了UIImage的imageWithRenderingMode方法,这样我就可以使用自定义图像而不是iOS创建的阴影剪影默认图像(我想感谢@NSHeffalump在这里提供的答案...)。
    if let viewControllers = tabBarController.viewControllers as? Array<UIViewController> {
        var tabBarItemImageNames = ["TabBarItemImage0","TabBarItemImage1","TabBarItemImage2","TabBarItemImage3","TabBarItemImage4"]
        var vcIndex = 0
        for vc:UIViewController in viewControllers {
            let selectedImage = UIImage(named: tabBarItemImageNames[vcIndex])?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
            let image = UIImage(named: tabBarItemImageNames[vcIndex])?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
            var tabBarItem = UITabBarItem(title: "", image: image, selectedImage: selectedImage)
            vc.tabBarItem = tabBarItem
            vcIndex++
        }
    }

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