Невозможно увидеть контроллер, добавленный в UITabBar программно быстро

Я добавил 2 элемента tabBar из раскадровки и один UITabBarItem - Меню программно. Я успешно могу открыть контроллеры, соответствующие tabBarItems, которые я создал с помощью раскадровки. Однако, когда я нажимаю "Меню", появляется пустой черный экран,

@objc public class MainScreenTabsController : UITabBarController {
public override func viewDidLoad() {
    super.viewDidLoad()
    let tabController = MyViewController()
    let tabBarItem = UITabBarItem(title: "Menu", image: UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options"))
    tabController.tabBarItem = tabBarItem
    var array = self.viewControllers
    array?.append(tabController)
    self.viewControllers = array
}

public func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    return true;
}

public override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
}
}

Я следовал нескольким учебникам по добавлению элемента панели вкладок, но у всех них был код, который я написал. Я упускаю что-то очень простое? Три точки представляют меню. Слово меню не включено, потому что в реальном коде я дал пустую строку

РЕДАКТИРОВАТЬ:

Класс для контроллера меню

@objc public class MyViewController:UIViewController {

public override func viewDidLoad() {
    super.viewDidLoad()
}

public override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
}
}

2 ответа

Решение

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

Ваш MyViewController Файл класса просто определяет пустой черный вид.

Я предполагаю, что вы создали View Controller в вашей раскадровке, который вы хотите использовать в качестве MyViewController? Если это так, вам нужно создать экземпляр из раскадровки.

Когда вы редактируете раскадровку, назначьте MyViewController класс VC, который вы хотите использовать, а также дать ему Storyboard ID - такие как MyVC, Затем отредактируйте ваш viewDidLoad функция к этому:

public override func viewDidLoad() {
    super.viewDidLoad()

    // wrong way
    //  let tabController = MyViewController()

    if let tabController = storyboard?.instantiateViewController(withIdentifier: "MyVC") as? MyViewController {

        let tabBarItem = UITabBarItem(title: "Menu", image: UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options"))
        tabController.tabBarItem = tabBarItem
        var array = self.viewControllers
        array?.append(tabController)
        self.viewControllers = array

    }

}

Так как вы создаете ViewController программно, т.е. без пера / раскадровки вы несете ответственность за создание экземпляра объекта UIView и установку свойства view контроллера представления. Для этого реализуйте метод loadView и назначьте объект вида для просмотра свойства viewController. затем вы можете добавить пользовательские представления к объекту просмотра, проверьте код ниже.

class MyViewController: UIViewController {

    override func loadView() {
        // super.loadView()   // DO NOT CALL SUPER

        //create view
        view = UIView()
        view.backgroundColor = UIColor.white

        //Add a custom view with red color
        let customView = UIView()
        customView.translatesAutoresizingMaskIntoConstraints = false
        customView.backgroundColor = UIColor.red
        view.addSubview(customView)

        NSLayoutConstraint.activate(
            [customView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
             customView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
             customView.topAnchor.constraint(equalTo: view.topAnchor),
             customView.bottomAnchor.constraint(equalTo: view.bottomAnchor)]
        )
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
}

Было бы хорошо использовать Storyboard/Nib для этой цели, так как вы можете легко настраивать собственные представления / элементы управления, используя автоматическую компоновку в конструкторе интерфейсов, а не делать это программно.:)

Редактировать:

если вы используете раскадровку, создайте экземпляр контроллера вида, как показано в приведенном ниже коде

class MainScreenTabsController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let tabController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainViewController") as! MainViewController //if using storyboard 
        let icon = UITabBarItem(title: "Menu", UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options")))
        tabController.tabBarItem = icon
        var controllers = self.viewControllers
        controllers?.append(tabController)
        self.setViewControllers(controllers!, animated: true)
    }
}
Другие вопросы по тегам