首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问TabBarController

访问TabBarController
EN

Stack Overflow用户
提问于 2015-08-18 06:47:28
回答 2查看 940关注 0票数 0

我有一个有5个图标的TabBarController。在所有5个ViewControllers中,我都有多余的代码来更新TabBarController的徽章。

这是我的冗余代码:

代码语言:javascript
复制
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文件中的一个函数:

代码语言:javascript
复制
import UIKit
import Foundation

func getBadgeValueFor(wich: Int) -> String? {
    // calculating the badge here...
}
:
// more stuff here

为了减少代码冗余,我也想将updateBadges移动到我的助手类。但从那以后,我无法访问tabBarController。因此,如果我简单地将有趣的updateBadges复制到我的助手文件中,它就不能工作了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-18 07:24:02

  1. 您可以将tabBarController本身传递给方法,因为argument.and只是从视图控制器中调用该方法。 func updateBadges(tabBarController : UITabBarController) { (tabBarController!.tabBar.items as!( UITabBarItem).badgeValue = getBadgeValueFor(0) (tabBarController!.tabBar.items as!( UITabBarItem).badgeValue = getBadgeValueFor(1) (tabBarController!.tabBar.items as!( UITabBarItem).badgeValue = getBadgeValueFor(3) (tabBarController!.tabBar.items as!UITabBarItem).badgeValue = getBadgeValueFor(4)}
  2. 如果只想在选项卡更改时更改徽章,则可以将父视图控制器或应用程序委托设置为UITabBarControllerDelegate,并在tabBarController:didSelectViewController:方法中调用update view方法。但是,您仍然需要在委托类中保留对选项卡条控制器的引用,并将选项卡条控制器作为参数传递给更新标记方法。
  3. 但是,将选项卡条控制器传递给该方法将限制您只从具有直接访问选项卡条控制器对象的上下文调用它。为了避免这种情况,您可以在helper类中引用选项卡栏控制器。并添加方法来注册选项卡条以进行更新。 静态变量myTabBarController : UITabBarController?静态函数registerTabBarController(tbc : UITabBarController) { myTabBarController = tbc}

如果是根视图,则必须注册来自父或应用程序委托的选项卡条控制器。

然后,可以对此对象执行所有更新。

代码语言:javascript
复制
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)
}

可选调用确保即使没有设置选项卡条控制器对象,也不会崩溃。对象和静态函数确保不必实例化助手。

票数 2
EN

Stack Overflow用户

发布于 2015-08-18 06:56:42

在helper类中创建一个函数,该函数将viewController实例作为参数。然后从您的视图中,控制器以self作为参数调用该函数。在helper类中的函数中,可以从tabBarController实例访问viewController

帮助者班:

代码语言:javascript
复制
func update_badge(vc : ViewController)
{

    vc.tabBarController .../// access like this

}

*代码可能有语法错误

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32065399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档