如何从选项卡栏控制器更改选项卡栏项目

时间:2020-04-16 12:39:14

标签: ios swift uiviewcontroller delegates uitabbarcontroller

我有三个视图控制器设置的标签栏控制器。当我打开视图控件时,其中之一会更改其选项卡栏项目badgeValue。当我到达第一个标签时,我已经想更改此badgeValue。

我创建了一个Tabbarcontoller:UITabBarController类,但是不知道如何轻松访问子视图的项目。这是我的Tabbarcontoller类中的代码:

    class TabBarController: UITabBarController, MainMethodsDelegate {

    var myFriendsRequests: [UserInfo] = []
    var friendRequestsCount: Int = 0

    func getFriendsRequests_Methods_Destination(myFriendsRequest: UserInfo) {
        myFriendsRequests.append(myFriendsRequest)
        self.friendRequestsCount = myFriendsRequests.count

        DispatchQueue.main.async {
            //friendsBarItem.badgeValue = String(self.friendRequestsCount)
        }
    }

    let mainMethods = MainMethods()

    override func viewDidLoad() {
        super.viewDidLoad()

        mainMethods.delegate = self
        mainMethods.getFriendsRequests()

    }
}

这里是子视图控制器的工作代码:

class FriendsViewController: UIViewController, MainMethodsDelegate {

    var myFriendsRequests: [UserInfo] = []
    var friendRequestsCount: Int = 0

    func getFriendsRequests_Methods_Destination(myFriendsRequest: UserInfo) {
        myFriendsRequests.append(myFriendsRequest)
        self.friendRequestsCount = myFriendsRequests.count

        DispatchQueue.main.async {
            self.friendsBarItem.badgeValue = String(self.friendRequestsCount)
        }

    }

    let mainMethods = MainMethods()

    override func viewDidLoad() {
        super.viewDidLoad()

        mainMethods.delegate = self
        mainMethods.getFriendsRequests()
    }

    @IBOutlet weak var friendsBarItem: UITabBarItem!

}

我正在寻找一种简单的方法来访问子视图控制器或至少显示它的栏项目:

//friendsBarItem.badgeValue = String(self.friendRequestsCount)

我不确定代表是否是正确的选择?

2 个答案:

答案 0 :(得分:0)

我将把该栏项目留在friends控制器之外。它不需要了解tabBar。如果我是您,我将创建一个协议以告知您的tabBarController朋友请求的数量已更改。

首先,定义协议:

protocol FriendsRequestDelegate {
    func friendsRequestsDidChange(number: Int)
}

然后,将变量添加到您的FriendsViewController中:

weak var delegate: FriendsRequestDelegate?

而且,我们需要在获取了好友请求数量后,仍在FriendsViewController中触发该函数;

delegate?.friendsRequestsDidChange(number: myFriendsRequests.count)

最后,使您的TabBarController符合此协议;

extension TabBarController: FriendsRequestDelegate {

   func friendsRequestsDidChange(number: Int) {
       friendsBarItem.badgeValue = String(number)
   }

}

明白我的意思吗?这样,您的friendsRequestController不会知道tabBar,它将使您的代码保持干净。

答案 1 :(得分:0)

我找到了一种访问barItems的非常简单的方法。我只需要使用以下方法访问tabBar项的数组:

tabBar.items![2].badgeValue = ""

这是我的UITabBarController代码:

class TabBarController: UITabBarController, MainMethodsDelegate {

    var myFriendsRequests: [UserInfo] = []
    var friendRequestsCount: Int = 0

    func getFriendsRequests_Methods_Destination(myFriendsRequest: UserInfo) {
        myFriendsRequests.append(myFriendsRequest)
        self.friendRequestsCount = myFriendsRequests.count

        DispatchQueue.main.async {

            self.tabBar.items![2].badgeValue = String(self.friendRequestsCount)

        }
    }

    let mainMethods = MainMethods()

    override func viewDidLoad() {
        super.viewDidLoad()

        mainMethods.delegate = self
        mainMethods.getFriendsRequests()
    }
}

子视图控制器不再需要检查和更新badgeValue。 (在我的情况下,这很好,因为无论如何有新朋友使用(Firestore)快照侦听器请求时都会触发getFriendsRequests_Methods_Destination(myFriendsRequest: UserInfo)方法。)

我的最初方法是使用tabBarController!.tabBar.items![2].badgeValue = ""从每个子视图控制器分别访问tabItem,但这在我看来是多余的。