Как добавить еще один TabBarItem после того, как TabBarController загрузил его вид - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу иметь возможность добавить новый TabBarItem после выполнения определенного условия. Итак, изначально у приложения есть два TabBarItems, но если вы решите войти в систему как администратор, я хочу, чтобы третий TabBarItem отображался

Я могу добавить штраф TabBarItem в viewDidLoad моего TabBarController, который расширяет UITabBarController. Но если я добавлю функцию с именем addNewTabBar, которая вызывает точно такой же код, код будет выполнен, но представление не обновится.

class TabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
//        let sb = UIStoryboard(name: "Data", bundle: nil)
//        let roomChooserVC = sb.instantiateViewController(withIdentifier: "roomchooser") as! RoomChooserController
//        roomChooserVC.tabBarItem = UITabBarItem(tabBarSystemItem: .downloads, tag: 3)
//        self.viewControllers?.append(roomChooserVC)
//
//        ^^^^IF I ADD THE TAB IN VIEWDIDLOAD IT WORKS FINE ^^^

    }

// If I call addNewTabBarItem() from another class, the methods get executed but the new tab is not shown ---

    func addNewTabBarItem(){
        let sb = UIStoryboard(name: "Data", bundle: nil)
        let roomChooserVC = sb.instantiateViewController(withIdentifier: "roomchooser") as! RoomChooserController
        roomChooserVC.tabBarItem = UITabBarItem(tabBarSystemItem: .downloads, tag: 3)
        self.viewControllers?.append(roomChooserVC)
    }
}

Теперь в классе, в котором я вызываю метод from (опущены некоторые не относящиеся к делу коды

let tbController = TabBarController()

override func viewDidLoad() {
        super.viewDidLoad()

        tbController.addNewTabBarItem()
        // If I put a breakpoint in addNewTabBarItem everything's get 
        // executed fine
        // MAYBE RELOAD VIEW OF TABBARCONTROLLER SOMEHOW?
}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Эта строка в контроллере представления вашей первой вкладки:

let tbController = TabBarController()

создает новый экземпляр TabBarController - он не предоставляет доступ к существующему экземпляру.

Итак, в контроллере представления вашей первой вкладки:

class HjelmslundFirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // this gets a reference to the existing custom TabBarController
        if let tbc = self.tabBarController as? TabBarController {
            tbc.addNewTabBarItem()
        }

    }

}

Как примечание, вы всегда должны разворачивать дополнительные параметры и проверять наличие допустимых объектов. Итак, в вашем пользовательском TabBarController классе:

func addNewTabBarItem(){

    let sb = UIStoryboard(name: "Data", bundle: nil)

    if let roomChooserVC = sb.instantiateViewController(withIdentifier: "roomchooser") as? RoomChooserController {
        roomChooserVC.tabBarItem = UITabBarItem(tabBarSystemItem: .downloads, tag: 3)
        self.viewControllers?.append(roomChooserVC)
    }

}

Конечно, вы также захотите добавить код обработки ошибок в случае сбоя условий if.

0 голосов
/ 25 апреля 2019

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

Сначала объявите переменную main в вашем TabBarController:

static var main : TabBarController? = nil

Вкл. viewDidLoad или viewWillAppear добавить код:

TabBarController.main = self // a part of 'singletone' approach

и в вашем другом контроллере используйте:

TabBarController.main?. addNewTabBarItem()

Важно, чтобы ваш класс использовал один экземпляр.

...