我有一个带有5个图标的TabBarController。在所有5个ViewControllers中,我都有冗余代码来更新TabBarController的徽章。
这是我的冗余代码:
data-target
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.latestTableOverView.reloadData()
// Update the badge:
self.updateBadges()
}
func updateBadges() {
(tabBarController!.tabBar.items![0] as! UITabBarItem).badgeValue = getBadgeValueFor(0)
(tabBarController!.tabBar.items![1] as! UITabBarItem).badgeValue = getBadgeValueFor(1)
(tabBarController!.tabBar.items![3] as! UITabBarItem).badgeValue = getBadgeValueFor(3)
(tabBarController!.tabBar.items![4] as! UITabBarItem).badgeValue = getBadgeValueFor(4)
}
是getBadgeValueFor
文件中的一个函数:
helper.swift
为了减少代码冗余,我想将import UIKit
import Foundation
func getBadgeValueFor(wich: Int) -> String? {
// calculating the badge here...
}
:
// more stuff here
移动到我的助手类。但是从那里,我无法访问tabBarController。因此,如果我只是将乐趣updateBadges
复制到我的助手文件中,它将无法正常工作。
答案 0 :(得分:2)
您可以将tabBarController本身作为参数传递给方法。只需从视图控制器调用该方法。
func updateBadges(tabBarController : UITabBarController) {
(tabBarController!.tabBar.items![0] as! UITabBarItem).badgeValue = getBadgeValueFor(0)
(tabBarController!.tabBar.items![1] as! UITabBarItem).badgeValue = getBadgeValueFor(1)
(tabBarController!.tabBar.items![3] as! UITabBarItem).badgeValue = getBadgeValueFor(3)
(tabBarController!.tabBar.items![4] as! UITabBarItem).badgeValue = getBadgeValueFor(4)}
如果您只想在更改标签时更改标记,可以将父视图控制器或应用委托设置为UITabBarControllerDelegate
,并在tabBarController:didSelectViewController:
方法中调用更新标记方法。
但是,您仍需要在委托类中保留对标签栏控制器的引用,并将标签栏控制器作为参数传递给更新标记方法。
但是将标签栏控制器传递给方法会限制您仅从可直接访问标签栏控制器对象的上下文中调用它。为避免这种情况,您可以在辅助类中引用标签栏控制器。并添加方法来注册标签栏以进行更新。
static var myTabBarController : UITabBarController?
static func registerTabBarController(tbc : UITabBarController) {
myTabBarController = tbc}
如果是根视图,您必须从父级或app appate注册标签栏控制器。
然后,您可以对此对象执行所有更新
static func updateBadges() {
(myTabBarController?.tabBar.items![0] as! UITabBarItem).badgeValue = getBadgeValueFor(0)
(myTabBarController?.tabBar.items![1] as! UITabBarItem).badgeValue = getBadgeValueFor(1)
(myTabBarController?.tabBar.items![3] as! UITabBarItem).badgeValue = getBadgeValueFor(3)
(myTabBarController?.tabBar.items![4] as! UITabBarItem).badgeValue = getBadgeValueFor(4)
}
可选调用确保即使未设置标签栏控制器对象,也不会崩溃。 对象和函数是静态的,确保您不必实例化帮助程序。
答案 1 :(得分:0)
在helper类中创建一个函数,它将viewController
实例作为参数。
然后从您的视图控制器调用该函数与self作为参数。
在帮助程序类的函数内部,您可以从tabBarController
实例访问viewController
。
助手类:
func update_badge(vc : ViewController)
{
vc.tabBarController .../// access like this
}
*代码可能有语法错误