使用故事板更改UItabbar项的图像

时间:2012-07-26 00:19:45

标签: ios uitabbar

嘿伙计们,我有以下故事板enter image description here

正如您所看到的,在故事板上有一个带有5个选项卡的标签栏应用程序,我为每个标签分配了徽标。现在,当用户单击特定视图中的单元格时,我想要更改其中一个选项卡的图像。我怎样才能做到这一点?我没有标签栏视图控制器或项目的实例,因为故事板几乎为我做了所有这些。所以我的问题是我需要采用哪些方法来改变图像?如果我需要标签栏控制器,我如何获取其实例以及我应该在哪个类中指向它?

非常感谢,

3 个答案:

答案 0 :(得分:2)

在作为Tab Bar层次结构一部分的任何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 :(得分:2)

每个UIViewController都有一个名为tabBarItem的属性,它是一个UITabBarItem,标签栏控制器用它来设置代表该控制器的图像。您可以通过操作来更改相关控制器的图像。

答案 2 :(得分:0)

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

然而,@ borrrden的回答让我走上正轨。 Apple's documentation for UITabBarController非常明确地指出:

  

您永远不应该访问标签栏控制器的标签栏视图   直。要配置标签栏控制器的选项卡,请指定   视图控制器,为每个选项卡提供根视图   viewControllers属性。

     

...

     

标签栏项目通过其相应的视图进行配置   控制器。要将标签栏项目与视图控制器相关联,请创建   UITabBarItem类的新实例,适当地配置它   对于视图控制器,并将其分配给视图控制器   tabBarItem属性。

因此,根据这一点,以下是我提出的对我有用的内容。

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

我还使用了UIImage的imageWithRenderingMode方法,因此我可以使用自定义图像而不是iOS创建的阴影轮廓默认图像(我想赞美@ NSHeffalump的答案here。 ..)。

    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++
        }
    }