Как изменить элемент панели вкладок из контроллера панели вкладок - PullRequest
0 голосов
/ 16 апреля 2020

Я получил контроллер панели вкладок с настройкой трех контроллеров представления. Один из этих контроллеров представления изменяет свой элемент панели вкладок 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()

    }
}

А вот рабочий код из контроллера sub view:

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)

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

Ответы [ 2 ]

0 голосов
/ 16 апреля 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 из каждого контроллеров sub view по отдельности с использованием tabBarController!.tabBar.items![2].badgeValue = "" Но в моем случае это было бы излишним.

0 голосов
/ 16 апреля 2020

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

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

protocol FriendsRequestDelegate {
    func friendsRequestsDidChange(number: Int)
}

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

weak var delegate: FriendsRequestDelegate?

И нам нужно запустить этот забавный c, все еще в FriendsViewController, после получения запроса количества друзей добавьте;

delegate?.friendsRequestsDidChange(number: myFriendsRequests.count)

Наконец, заставить ваш TabBarController соответствовать этому протоколу;

extension TabBarController: FriendsRequestDelegate {

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

}

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

...