Невозможно увидеть контроллер, добавленный в 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)
}
}