【问题标题】:How to change a tab bar item from the tab bar controller如何从标签栏控制器更改标签栏项目
【发布时间】:2020-07-29 16:54:27
【问题描述】:

我得到了带有三个视图控制器设置的标签栏控制器。当我打开其中一个视图控制器时,它会更改其选项卡栏项 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)

我不确定委托是否是正确的方法?

【问题讨论】:

    标签: ios swift uiviewcontroller delegates uitabbarcontroller


    【解决方案1】:

    我会将 bar 项从好友控制器中移除。它不需要知道tabBar。如果我是你,我会创建一个协议让你的 tabBarController 知道好友请求的数量发生了变化。

    首先,定义协议:

    protocol FriendsRequestDelegate {
        func friendsRequestsDidChange(number: Int)
    }
    

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

    weak var delegate: FriendsRequestDelegate?
    

    而且,我们需要触发那个func,还在FriendsViewController中,获取好友请求数后,添加;

    delegate?.friendsRequestsDidChange(number: myFriendsRequests.count)
    

    最后,让你的 TabBarController 符合这个协议;

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

    明白我的意思了吗?这样你的 friendsRequestController 就不会知道 tabBar 并且它会让你的代码保持干净。

    【讨论】:

    • 感谢您的解决方案,但我想我找到了一种更简单的方法,因为我只需要访问 barItems 就足够了。
    【解决方案2】:

    我找到了一种访问 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 但这在我的情况下是多余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多