我有以下故事板:
如您所见,有一个带有 5 个选项卡的选项卡栏应用程序,在情节提要上,我为每个选项卡分配了徽标。现在,当用户单击特定视图中的单元格时,我想更改其中一个选项卡的图像。我怎样才能做到这一点?我没有标签栏视图控制器或项目的实例,因为情节提要几乎为我完成了所有这些工作。所以我的问题是我必须实施哪些方法来更改图像?如果我需要标签栏控制器,我该如何获取它的实例以及我应该将它指向哪个类?
非常感谢你,
在任何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
每个 UIViewController 都有一个名为的属性tabBarItem
,它是UITabBarItem
标签栏控制器用来设置表示该控制器的图像的属性。您可以对其进行操作以更改相关控制器的图像。
我发现——至少在使用 Swift 的 Xcode 6.1.1 中——对 tabBarItem 的直接操作对我不起作用。
但是,@borrrden 的回答让我走上了正轨。Apple 的 UITabBarController 文档非常清楚地说明:
你不应该直接访问标签栏控制器的标签栏视图。要配置选项卡栏控制器的选项卡,请将为每个选项卡提供根视图的视图控制器分配给 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++
}
}