无法看到控制器以编程方式添加到UITabBar swift
我以故事板和一个UITabBarItem - 菜单以编程方式添加了2个tabBar项目。我成功地能够打开与我使用storyboard创建的tabBarItems对应的控制器。然而,当我点击“菜单”出现黑屏,无法看到控制器以编程方式添加到UITabBar swift
@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)
}
}
您的应用做什么你的代码是告诉它做的事。您正在创建MyViewController
的实例并将其添加到UITabBarController
的视图控制器阵列中。
您的MyViewController
类文件只是定义了一个空白的黑色视图。
我猜你在Storyboard中创建了一个你想用作MyViewController
的ViewController?如果是这样,你需要从故事板实例化。
当你编辑的故事板,分配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
}
}
是的,我在故事板中创建了控制器。为什么你在一个括号内写tabBarItem和其他声明?当我这样做时,我得到一个错误。现在,我使用 let sb = UIStoryboard(名称:“Utility”,bundle:nil) 让tabController = sb.instantiateViewController(withIdentifier:“MyViewController”)as? MyViewController和其他代码行如下。但屏幕仍然是空白的。 –
“括号内”的代码位于“if let”结构中,这有助于避免强制展开和零选项。在你的'let sb = UIStoryboard(name:“Utility”,bundle:nil)'line上放一个断点,检查你正在创建的变量/对象的值。看看是否有什么失败。 – DonMag
非常感谢您的帮助和解释。解决方案奏效! –
既然你编程即创建视图控制器。没有nib/storyboard,你负责实例化一个UIView对象并设置视图控制器的视图属性。要做到这一点,实现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.
}
}
这将是很好的使用情节提要/笔尖为了这个目的,你可以轻松地配置使用界面生成器的自动布局,而不是编程方式做自定义视图/控制。 :)
编辑:
如果傻冒用故事板则实例化视图控制器如下面的代码给出
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)
}
}
我用故事板创建了UIViewController。然后将其与我的课程相关联 –
您是否尝试过没有故事板的代码?如果你使用故事板,那么你需要使用代码来实例化视图控制器,如let tabController = UIStoryboard(name:“Main”,bundle:nil).instantiateViewController(withIdentifier:“MainViewController”)as! MainViewController – suhit
显示背屏(菜单)控制器代码 –
感谢您寻找到它。编辑问题 –
我不认为MyViewController()会给你InstantiatedViewController –