以编程方式创建的 iOS UITabBarController 未显示其“更多”导航控制器

Posted

技术标签:

【中文标题】以编程方式创建的 iOS UITabBarController 未显示其“更多”导航控制器【英文标题】:iOS UITabBarController created programmatically is not displaying its "More" navigation controller 【发布时间】:2020-09-17 01:04:25 【问题描述】:

我想创建一个带有 6 个子视图控制器的 ios UITabBarController,这足以使“更多”选项卡在 iPhone 11 Pro Max 上以纵向显示。作为一个实验,我想在 Swift 中以编程方式执行此操作,而不对我的 Xcode 项目的 Main.storyboard 文件进行任何修改。以下是我的整个 ViewController.swift 文件,在 macOS Catalina 10.15.4 上使用默认的“Single View App”Xcode 11.5。

import UIKit;

class ViewController: UITabBarController 
    override func viewDidLoad() 
        super.viewDidLoad();
        // Do any additional setup after loading the view.

        struct Band 
            let badge: String;
            let color: UIColor;
            let systemItem: UITabBarItem.SystemItem;
        

        let bands: [Band] = [
            Band(badge: "0", color: .red,    systemItem: .bookmarks),
            Band(badge: "1", color: .orange, systemItem: .contacts),
            Band(badge: "2", color: .yellow, systemItem: .downloads),
            Band(badge: "3", color: .green,  systemItem: .favorites),
            Band(badge: "4", color: .blue,   systemItem: .featured),
            Band(badge: "5", color: .purple, systemItem: .history)
        ];

        let kids: [UIViewController] = bands.map 
            let viewController: UIViewController = UIViewController();
            viewController.tabBarItem = UITabBarItem(tabBarSystemItem: $0.systemItem, tag: Int($0.badge)!);
            viewController.tabBarItem.badgeValue = $0.badge;
            viewController.view.backgroundColor = $0.color;
            return viewController;
        

        //Make sure all 6 kids are present and okay.
        kids.forEach print($0.tabBarItem.tag, $0.tabBarItem.badgeValue!);

        setViewControllers(kids, animated: true);  //Why only getting 4 of 6 in portrait?
        print("viewControllers!.count = \(viewControllers!.count)");
    

viewControllers!.count 应该是 6。但是当我在 iPhone 11 Pro Max 模拟器上纵向运行时,viewControllers!.count 是 4,我只看到前 4 个孩子的标签,没有“更多”标签。 (当我在已经处于横向的 iPhone 11 Pro Max 模拟器上运行该项目时,viewControllers!.count 为 6,我看到所有 6 个孩子的选项卡。)同样的事情发生在我的 iPhone 8 Plus 模拟器上。为什么我在 6 个中只有 4 个在纵向上没有“更多”,并且是否可以通过修改 ViewController.swift 文件来做我想做的事情?提前谢谢你。

【问题讨论】:

您的代码似乎没问题,我得到了 4 + 1 个菜单,另外还有 2 个菜单。 谢谢你看这个,弗兰肯斯坦。我添加了我的 iPhone 11 Pro Max 模拟器的纵向屏幕截图,以向您展示我所看到的。 您可以尝试清除模拟器的数据并再次运行吗?另外,请在再次运行之前尝试清除派生数据并清理项目。 谢谢,我删除了 DerivedData 文件夹,在 Xcode 中执行“Product -> Clean Build Folder”,从模拟器中删除应用程序,然后重试。我仍然只有 4 个标签。同样的事情也发生在其他模拟器中(例如 iPhone 8 Plus 纵向)。 【参考方案1】:

听起来您从一个默认的单视图应用开始,然后将您的课程更改为:

class ViewController: UIViewController 

到:

class ViewController: UITabBarController 

这是行不通的。

假设是这样:

从 Storyboard 中删除视图控制器 添加UITabBarController 删除自带的两个“默认”视图控制器 将新增标签栏控制器的Custom Class设置为ViewController

应该可以的。

旁注:我会更改班级名称...

class MyTabBarController: UITabBarController 

【讨论】:

是的,谢谢,我使用的是“单一视图应用程序”模板。因此,我按照您的指示创建了一个新项目,它们运行良好!我唯一需要添加的是选中标签栏控制器的属性检查器中的“是初始视图控制器”复选框。而且您对更改班级名称也是正确的。但是为什么我的初始程序不起作用?如果我用原来的Main.storyboard,为什么操作系统让我实例化自己的UIViewController子类,却不让我实例化自己的UITabBarController子类? @MarkMeretzky - 您不能简单地将自定义类分配给对象。例如,如果你写一个class MyImageView: UIImageView,在你的故事板上放一个UILabel,然后将该标签的自定义类分配给MyImageView,你就会遇到问题。

以上是关于以编程方式创建的 iOS UITabBarController 未显示其“更多”导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在 iOS 上创建 PPTP ***

iOS:使用 IB 为以编程方式创建的 UITableView 创建自定义单元格

以编程方式创建 ios 天才播放列表

iOS 以编程方式创建的按钮不起作用

iOS - 以编程方式创建今日小部件扩展

如何在 iOS 上以编程方式创建选项卡视图