在基于故事板的应用程序中禁用/启用 UITabBarController 中的选项卡

2024-01-01

我已经使用故事板构建了我的应用程序,所有视图都由选项卡控制器管理。

所以在发布时(我目前只在 iPad UI 上工作)它会这样做:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
    {
        UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
        UISplitViewController *splitViewController = [tabBarController.viewControllers objectAtIndex:0];
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;

        UINavigationController *masterNavigationController = [splitViewController.viewControllers objectAtIndex:0];
        ProductionMasterViewController *controller = (ProductionMasterViewController *)masterNavigationController.topViewController;
        controller.managedObjectContext = self.managedObjectContext;
    }
}

我希望能够根据用户输入启用或禁用 tabBarController 中的选项卡(因此,例如,需要在第一个选项卡中选择一个项目才能访问第二个和第三个选项卡,默认情况下禁用这些选项卡)

我不清楚如何访问选项卡以启用/禁用它们。我会创建一个 appdelegate 实例然后做类似的事情吗

AppDelegate *d = (AppDelegate *)[[UIApplication sharedApplication] delegate];
UITabBarController *tabs = (UITabBarController *)[d.window rootViewController];
[[[[tabs tabBar] items] objectAtIndex:2] setEnabled:YES];
[[[[tabs tabBar] items] objectAtIndex:3] setEnabled:YES];
[[[[tabs tabBar] items] objectAtIndex:4] setEnabled:YES];

(这看起来应该可行,但也看起来相当恶心。)


由于您使用的是基于故事板的应用程序,我假设您有UITabBarController在故事板中定义为根控制器。顺便说一句,您还可以通过标识符检索它,而不是从窗口走到根视图控制器。

限制哪些选项卡可选,是通过设置 UITabBarController 的委托来实现的(即符合UITabBarControllerDelegate).

在委托中,您可以实现这两个方法:

– tabBarController:shouldSelectViewController:

– tabBarController:didSelectViewController:

可能,您只需要第一个限制(禁止)选择,直到您的工作流程准备就绪。

另一种方法是在每次通过里程碑时在选项卡栏控制器上设置“viewControllers”属性。在每个里程碑中,您可以在该属性中设置更广泛的视图控制器数组,这将打开附加视图控制器的选择选项卡项目。

SWIFT 3

(为了便于理解而进行了扩展)

let arrayOfTabBarItems = tabBarController?.tabBar.items

        if let barItems = arrayOfTabBarItems, barItems.count > 0 {
            os_log("barItems.count is now ", barItems.count)
            tabBarItem0 = barItems[0]
            tabBarItem0.isEnabled = true
            tabBarItem1 = barItems[1]
            tabBarItem1.isEnabled = true
            tabBarItem2 = barItems[2]
            tabBarItem2.isEnabled = true
            tabBarItem3 = barItems[3]
            tabBarItem3.isEnabled = true
            tabBarItem4 = barItems[4]
            tabBarItem4.isEnabled = true
        }

这可以在每个选项卡控制器上的 viewWillAppear 中使用。根据此检查您的规则并相应地限制每个选项卡。 (更简洁的方法)

let arrayOfAllTabBarItems = tabBarController?.viewControllers
    if   let tabBarArray = arrayOfAllTabBarItems, tabBarArray.count > 0 {
        for x in 0...tabBarArray.count-1 {
            let tabBarItem = tabBarArray[x]
            if tabBarItem.title != nil {
                if tabBarItem.title == "Tab1" || tabBarItem.title == "MyTab" || tabBarItem.title == "Tab2Check" {
                    tabBarItem.tabBarItem.isEnabled = !(isMyRuleTrue!)
                }
            }
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在基于故事板的应用程序中禁用/启用 UITabBarController 中的选项卡 的相关文章

  • iOS7及以上版本中如何在接收器和扬声器之间切换音频输出?

    我有一个音频播放器 可以选择在接近传感器通知 1 时将音频输出从扬声器切换到接收器 耳机 无论是否连接耳机 以下是我执行此操作的代码 void switchAudioOutput NSString output AVAudioSession
  • 核心蓝牙在后台进行广告和扫描

    我一直在尝试设置一个应用程序 使设备既扫描外围设备又作为外围设备进行广告 目标是当两个设备通过蓝牙发现彼此靠近时在后台被唤醒 从 Apple 文档来看 您似乎应该能够在后台运行 BLE 启用蓝牙中心和蓝牙外设后台模式 并且当一台设备位于前台
  • 如何使用 Unity 在 Android 设备上以各种宽高比显示游戏的相同部分?

    我从 Libgdx 引擎转向 Unity 是一名初级程序员 我尝试在 Unity 中为 Android 和 iOS 设备制作游戏 但在宽高比 分辨率缩放方面遇到问题 在 Libgdx 中 如果您开发了一些东西 您可以指定 默认 分辨率 并且
  • 应用程序在第二次运行 nsnull 计数的循环时崩溃

    我有一个循环 第一次运行正常 但第二次循环时我得到 NSNull count unrecognized selector sent to instance 0x3a094a70 Terminating app due to uncaught
  • CoreAnimation 性能分析 - CAReplicatorLayer 与 CAShapeLayer

    我正在制作一个依赖 CoreAnimation 的应用程序 它有一个 CAReplicatorLayer 和一个 CAShapeLayer 作为子层 当进行 12 次复制 然后对路径进行动画处理 在 touchMoved 上更改它 时 一旦
  • 移动 Safari 中的文件上传和 EXIF

    正如这些问题中所指出的 在某些情况下 iOS 上上传的照片的地理位置和其他 EXIF 元数据会被删除 在 safari 中 https apple stackexchange com questions 326789 gps exif fr
  • 使用prefersLargeTitles 和 UITableView 平滑滚动

    我在使用时遇到了滚动问题prefersLargeTitles并添加了UITableView 如果我设置prefersLargeTitles在导航控制器中 其根是UITableViewController一切都很好 导航大标题的滚动方式与我们
  • iOS UITableViewCell 配件在左侧?

    对于我的应用程序 我想要一些可以同时具有复选标记和详细信息披露按钮的单元格 也就是说 我希望它们看起来与 iOS 设置中的 Wi Fi 网络选择一模一样 左侧的复选标记 中间的内容 右侧的详细信息披露按钮 有没有正确的方法来做到这一点 或者
  • 找不到导航对象。您的组件是否位于导航器屏幕内?

    在我下面的代码中 当我使用 useNavigation 时 它会给出像我的问题一样的错误 如何使用useNavigation 请任何人都可以解决此错误 错误 找不到导航对象 您的组件是否位于导航器屏幕内 我从这里跟踪了代码https rnf
  • Xcode 不会在故事板中显示我的文本字段占位符文本

    当我在属性检查器中分配文本字段的占位符值时 它不会显示在故事板中 但是 当我运行应用程序的模拟器时 它就在那里 我缺少什么设置吗 我只想能够在编辑器中看到占位符文本 下面是 xcode 和模拟器之一的屏幕截图 我遇到了同样的问题 幸运的是我
  • 编写支持 iOS 3.1.3 和 iOS 4.x 的 iOS 应用程序时的陷阱

    我想编写一个可以在 iOS 3 1 3 到 iOS 4 1 上运行的应用程序 我知道如何设置部署目标和基础 SDK 阅读 Apple 文档后 它很大程度上依赖于检查类是否可用和 或实例是否响应特定选择器 现在我的问题是 如果 Apple 从
  • ios 8 核心数据崩溃

    保存时 CoreData 发生崩溃 2014 09 16 09 51 58 273 My app 2678 105246 Terminating app due to uncaught exception NSInvalidArgument
  • 如何保存 1 个 xcode 项目中的所有构建设置并在其他 xcode 项目上使用它们?

    我使用 xcode 4 5 和 cordova phonegap 来构建我的应用程序 我投入了大量时间来获取适合我的 Xcode 项目的构建设置 并且我想在我正在构建的多个应用程序上重用这些设置 我正在寻找是否有一种快速的方法来导出这些设置
  • 使用 UIActionSheet 更改视图时工具栏项目消失

    当从 a 启动视图时UIActionSheet按钮 通过导航栏后退按钮返回视图后 工具栏虽然仍然可见 但上面没有任何以前的按钮 自从更新到 iOS 6 以来 这个错误就出现了 并且是在模拟器和仅运行 iOS 6 的设备上测试时发生的 如果我
  • iOS 中的等宽字体是什么?

    我想要在我的 iOS 应用程序中为 UILabel 使用等宽字体 不幸的是 我找不到一个 甚至 美国打字机 实际上也不是等宽的 XCode 中可用的等宽字体是什么 iOS 等宽字体 Courier Courier Bold Courier
  • 更改 UITextField 辅助功能描述

    有没有办法将 UITextField 的辅助功能标签设置为 文本字段 之外的其他内容 因此 我不想将其称为 文本字段 而是将其命名为 代码验证字段 我的建议是不要试图在内置语音输出上智取系统 对于盲人用户来说 文本字段正在编辑 相当于 该项
  • 如何将十六进制数组转换为 UIImage?

    有几个与使用 P25mi 动态打印图像相关的未解答问题 没有一个得到公认的答案 下面有几个链接 如何将图像转换为位图代码以便在 iPhone 中进行蓝牙打印 https stackoverflow com questions 1383828
  • swift 中的负数模

    负数模如何在 swift 中工作 当我执行 1 3 时 它给出 1 但余数是 2 其中有什么问题 雨燕余数运算符 计算余数 整数除法 a b a a b b where 是截断整数除法 在你的情况下 1 3 1 1 3 3 1 0 3 1
  • 如何在 EKRecurrenceRule 中设置一周中某一天的数组?

    我想在用户选择的特定日期每周添加事件 可以是一个或多个 也可以是一整天 我将用户选择的日期值存储在模型类变量中 但是 当我添加事件并选择日期时 假设今天是星期一 我选择星期二和星期三并保存 然后我查看周一和周三添加的 iPhone 日历 我
  • Swift 中 UIImages 的淡入淡出动画

    我有一组图像 我希望它们在登录屏幕的背景中淡出 我无法在 swift 中找到任何可以做到这一点的东西 有什么办法我可以做到吗 这是我当前的代码 override func viewDidLoad super viewDidLoad star

随机推荐

  • JSF 2.0 h:ui 内的 inputText:repeat

    我应该如何更改以下示例 在提交 commandButton 后 更改 inputText 中的值不会消失 我明白为什么会发生这种情况 但我不知道如何解决
  • ASP.NET 应用程序中需要定时炸弹

    我们开发了一个定制的 ASP NET 应用程序 供在客户的 Intranet 上使用 看来他们不太可能为此付出代价 所以我们的老板希望我们引入一个定时炸弹 编辑 请仅提供技术答复 这是否是一个好 或合法 想法是 CEOoverflow co
  • .aspx 与 .ashx 主要区别

    aspx 和 ashx 页面之间有什么区别 当我需要处理从代码调用并返回响应的请求时 我现在使用 ashx 但我想要一个更技术性的答案 Page是一个特殊的案件处理者 通用 Web 处理程序 ashx 基于扩展的处理器 是所有没有 UI 且
  • 如何仅显示带有facet的极地ggplot的部分绘图区域?

    假设有一个极坐标数据集要绘制为扇形 library ggplot2 library reshape2 data lt melt matrix rnorm 1000 nrow 20 data type lt 1 2 data Var1 lt
  • 适用于 Android 的商业 IDE+模拟器?

    我是一个 Android 新手 但在过去的几周里 我在 2 台 PC 上安装了 JDK Eclipse Android SDK 两次安装都花了一天的时间进行调整和处理配置问题 并使不同的部分一起发挥作用 通常都是 PITA 在一台电脑上 我
  • 按超出范围的索引分配值到列表[重复]

    这个问题在这里已经有答案了 mylist a apple b ball c cat mylist 6 value print mylist Error IndexError list assignment index out of rang
  • Chainlink-以“bytes32”形式获取 API 时出现问题

    我一直在学习 chainlink API 并尝试修改example https docs chain link docs advanced tutorial 从 Chainlin 的文档中获取byets32来自 API 的值 该示例的原始代
  • C++ 优化矩阵乘法微内核中的 L1 缓存使用

    我的任务是实现一个优化的矩阵乘法微内核 用于计算C A B在 C 中 从以下代码片段开始 我遇到了一些违反直觉的行为 我需要一些帮助来更好地理解正在发生的事情 void mat mul double A double B double C
  • 关于服务和存储库的领域驱动设计问题

    我有两个实体用户和课程 用户可以参加多门课程 这使得关系成为一对多 但一门课程可以由许多学生选修 因此它具有多对多的关系 现在 我需要为用户注册课程 我的用户实体有 public void AddCourse Course course i
  • 系统托盘访问

    有没有办法 在 C 中 访问系统托盘 我不是在谈论制作通知图标 我想迭代托盘中的项目 我会猜测整个过程 但我不知道如何确定托盘中实际有什么 什么只是一个过程 并且还用我自己的图标来表示这些项目用户界面 您对 Win32 互操作有何看法 我发
  • 如何在 RDLC 中删除时间并仅显示日期

    我使用的是 Winform C 和 RDLC MySQL 我尝试仅在 Tablex 中显示日期 但这种日期格式也有时间 如何去掉时间 我的表情是 Fields date Value 请参阅下面我的报告 提前致谢 我在表达式中尝试了 Fiel
  • 找出给定页面上使用的 CSS 样式

    我有一个包含多个样式表的页面 其中的大部分样式实际上并未在页面中使用 已弃用等 我想导出新的样式表包含页面上实际使用的所有样式 有办法做到这一点吗 我也遇到了同样的问题 由于我需要分析的页面是仅登录的 并且是为了工作 所以我无法向外部应用程
  • 使用 swift 复制文件

    我正在使用此代码复制文件数据库 try fileManager copyItem atPath storeURL path toPath storeCopyURL path 我可以看到创建了一个新的 sqlite 数据库 后来 当我尝试使用
  • Maven 找不到依赖项 [dependencyResolutionException]

    我向我的项目添加了 Maven 依赖项 并且我的项目在本地编译 但不在服务器上编译 它无法解析新添加的依赖项 这是我的 pom xml 文件
  • Java 和 JavaScript 之间使用 OAEP 进行 RSA 加密

    我正在尝试在 JavaScript 中加密一个短字符串并在 Java 中解密 解密失败 我认为这是因为两个平台之间的块模式和 或填充不同 我尝试在Java和JavaScript中加密相同的字符串 并得到不同的结果 这表明确实存在差异 下面是
  • 如果这 3 个类别都遵循 SOLID 概念

    我想向您询问有关以下 SOLID 代码的更多信息 如果这三个类都遵循 SOLID 概念 public interface A public void calculate String a public class B implements
  • 每次运行 Appium、Ruby 测试时如何跳过 Chrome 欢迎屏幕

    我是 Appium 新手 所以我的要求是通过模拟器中的 Appium 运行 Web 驱动程序测试 但是当我每次运行 chrome 时总是显示欢迎屏幕 我必须手动跳过该屏幕才能查看测试结果并拍摄屏幕截图 如何跳过 chrome 欢迎屏幕 下面
  • 删除和添加链接服务器[重复]

    这个问题在这里已经有答案了 可能的重复 SQL Server 是否有针对链接服务器的 IF EXISTS 测试 https stackoverflow com questions 3104186 sql server is there an
  • Java中的回调方法是什么? (这个词的使用似乎很宽松)

    我不明白回调方法是什么 而且我听说人们非常宽松地使用该术语 在Java世界中 什么是回调方法 如果有人能提供一些Java回调方法的示例代码并进行解释 这将对我的Java学习之旅有很大帮助 回调是一段代码 您可以将其作为参数传递给其他代码 以
  • 在基于故事板的应用程序中禁用/启用 UITabBarController 中的选项卡

    我已经使用故事板构建了我的应用程序 所有视图都由选项卡控制器管理 所以在发布时 我目前只在 iPad UI 上工作 它会这样做 BOOL application UIApplication application didFinishLaun