无法看到控制器以编程方式添加到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) 
} 
} 

我跟着几个教程添加标签栏项目,但他们都有我写的代码。我错过了一些非常基本的东西吗? The three dots represent menu. The word menu is not included because in the real code I gave a blank string

编辑:

类的菜单控制

@objc public class MyViewController:UIViewController { 

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

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

显示背屏(菜单)控制器代码 –

+0

感谢您寻找到它。编辑问题 –

+0

我不认为MyViewController()会给你InstantiatedViewController –

您的应用做什么你的代码是告诉它做的事。您正在创建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 

    } 

} 
+0

是的,我在故事板中创建了控制器。为什么你在一个括号内写tabBarItem和其他声明?当我这样做时,我得到一个错误。现在,我使用 let sb = UIStoryboard(名称:“Utility”,bundle:nil) 让tabController = sb.instantiateViewController(withIdentifier:“MyViewController”)as? MyViewController和其他代码行如下。但屏幕仍然是空白的。 –

+0

“括号内”的代码位于“if let”结构中,这有助于避免强制展开和零选项。在你的'let sb = UIStoryboard(name:“Utility”,bundle:nil)'line上放一个断点,检查你正在创建的变量/对象的值。看看是否有什么失败。 – DonMag

+0

非常感谢您的帮助和解释。解决方案奏效! –

既然你编程即创建视图控制器。没有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) 
    } 
} 
+0

我用故事板创建了UIViewController。然后将其与我的课程相关联 –

+0

您是否尝试过没有故事板的代码?如果你使用故事板,那么你需要使用代码来实例化视图控制器,如let tabController = UIStoryboard(name:“Main”,bundle:nil).instantiateViewController(withIdentifier:“MainViewController”)as! MainViewController – suhit