Как изменить элемент панели вкладок из контроллера панели вкладок

У меня есть контроллер панели вкладок с настройкой трех контроллеров представления. Один из этих контроллеров представления меняет значок элемента панели вкладок, когда я его открываю. Я хотел бы изменить это значение значка уже при переходе на первую вкладку.

Я создал класс 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)

Я не уверен, что делегаты - это правильный путь?


person Marco Boerner    schedule 16.04.2020    source источник


Ответы (2)


Я бы оставил элемент бара вне контроллера друзей. Ему не нужно знать о tabBar. На вашем месте я бы создал протокол, чтобы сообщить вашему tabBarController, что количество запросов на добавление в друзья изменилось.

Сначала определите протокол:

protocol FriendsRequestDelegate {
    func friendsRequestsDidChange(number: Int)
}

Затем добавьте переменную в свой FriendsViewController:

weak var delegate: FriendsRequestDelegate?

И нам нужно запустить эту функцию, все еще в FriendsViewController, после получения запроса на количество друзей, add;

delegate?.friendsRequestsDidChange(number: myFriendsRequests.count)

Наконец, сделайте так, чтобы ваш TabBarController соответствовал этому протоколу;

extension TabBarController: FriendsRequestDelegate {

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

}

Видишь, что я имею в виду? Таким образом, ваш friendsRequestController не знает о tabBar, и это сохранит ваш код в чистоте.

person Morgan Le Gal    schedule 16.04.2020
comment
Спасибо за ваше решение, однако я думаю, что нашел способ, который намного проще, и, поскольку мне нужно только получить доступ к элементам панели, мне этого достаточно. - person Marco Boerner; 16.04.2020

Я нашел довольно простой способ доступа к 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. (В моем случае это нормально, поскольку метод getFriendsRequests_Methods_Destination(myFriendsRequest: UserInfo) срабатывает, как только появляется новый запрос на добавление в друзья с использованием прослушивателя моментальных снимков (Firestore).)

Мой первоначальный способ состоял в том, чтобы получить доступ к tabItem из каждого из контроллеров подпредставления по отдельности, используя tabBarController!.tabBar.items![2].badgeValue = "", но в моем случае это было бы избыточным.

person Marco Boerner    schedule 16.04.2020