无法看到控制器以编程方式快速添加到 UITabBar

Posted

技术标签:

【中文标题】无法看到控制器以编程方式快速添加到 UITabBar【英文标题】:Unable to see controller added to UITabBar programmatically swift 【发布时间】:2017-05-04 13:13:22 【问题描述】:

我以编程方式添加了故事板中的 2 个 tabBar 项目和一个 UITabBarItem - Menu。我成功地打开了与我使用情节提要创建的 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)


【问题讨论】:

显示后屏(菜单)控制器代码 感谢您的调查。编辑了问题 我不认为 MyViewController() 会给你 InstantiatedViewController @SivajeeBattina 我按照教程进行操作 - swiftdeveloperblog.com/code-examples/… MyViewController 不工作它应该继承标签栏控制器 【参考方案1】:

您的应用正在按照您的代码要求执行的操作。您正在创建MyViewController 的实例并将其添加到UITabBarController 的视图控制器数组中。

您的MyViewController 类文件只定义了一个空白的黑色视图。

我猜你在 Storyboard 中创建了一个 ViewController 来用作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

    


【讨论】:

是的,我在情节提要中创建了控制器。为什么要在括号内写 tabBarItem 和其他声明?当我这样做时,我得到一个错误。现在,我正在使用 let sb = UIStoryboard(name: "Utility", bundle: nil) let tabController = sb.instantiateViewController(withIdentifier: "MyViewController") 作为实例化? MyViewController 和其他代码行遵循此。但屏幕仍然是空白的。 “括号内”的代码位于if let 构造中,这有助于避免强制展开和 nil 选项。在您的let sb = UIStoryboard(name: "Utility", bundle: nil) 行上放置一个断点并逐步检查您正在创建的变量/对象的值。看看有没有什么问题。 非常感谢您的帮助和解释。解决方案奏效了!【参考方案2】:

因为您正在以编程方式创建 ViewController,即。如果没有 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.
    

为此目的使用 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)
    

【讨论】:

我使用情节提要创建了 UIViewController。然后将其与我的班级联系起来 你试过没有情节提要的代码吗?如果您使用故事板,那么您需要使用 let tabController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainViewController") 之类的代码来实例化视图控制器!主视图控制器

以上是关于无法看到控制器以编程方式快速添加到 UITabBar的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式快速添加不同数量的标签和滑块

如何以编程方式添加 UIBarButtonItem?

无法以编程方式向视频添加约束

以编程方式将 UILabel 添加到集合单元,快速

以编程方式设置初始视图控制器 Swift

将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?