如何使用 Storyboard ID 显示各种视图控制器(每个视图控制器都有其各自的导航控制器)

2023-12-02

我正在开发我的第一个应用程序。这就是我想要实现的目标:

将会有一个包含几个不同选项的菜单。为简单起见,假设它由带有 IBAction 出口的 UIButtons 组成,并且具有随时拉出菜单的功能。

每个菜单按钮在按下时应显示不同的导航控制器的内容。如果用户调出菜单并做出不同的选择,则他当前操作的导航控制器不应受到影响;新选择的导航链显示在旧导航链的顶部,并且通过菜单,用户可以随时返回到上一个导航链上离开的视图。

visual illustration (click for higher resolution): visual

请注意,有 3 个不同的导航控制器/链。根视图控制器(也是这个简化版本中的菜单)不属于其中任何一个。当先前实例化导航链之一时,重新实例化它是不够的,原因如下:如果用户位于选项 2 的屏幕 3 上,然后从菜单中选择选项 1,然后(再次)从菜单中,他应该查看选项 2 的屏幕 3——就在他上次停下的地方;当他之前离开导航链时他正在查看的视图控制器应该被带回顶部。

如果没有导航控制器,我可以实例化一个按钮并从情节提要中呈现一个视图控制器:

- (IBAction)buttonPressed:(id)sender {
    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"View 2"];
    [self presentViewController:controller animated:YES completion:nil];
}

但是,我不知道如何使这两种方法与所涉及的导航控制器一起使用。此外,我不确定这两种方法是正确的选择,因为我并不总是想实例化一个新的视图控制器:当按下菜单按钮时,应该执行检查以查看视图(导航?)具有相应标识符的控制器已被实例化。如果是这样,它应该简单地成为顶视图控制器。

总之,这是我的问题:

1) 我应该如何实例化并显示嵌入导航控制器中的视图控制器,最好使用故事板 ID?您使用导航控制器还是视图控制器的故事板 ID?

2)如何检查实例是否已经存在?同样,我应该检查现有的导航控制器还是视图控制器,最好的方法是什么?

3)如果选定的导航链已经实例化并且位于视图控制器堆栈中的某个位置,那么将其带到顶部的最佳方法是什么?

谢谢你!!

旁注 - 如果知道如何粘贴保留缩进和颜色格式的代码片段,那就太好了:)


正如 Rob 所建议的,标签栏控制器将为您的设计提供良好的组织原则。

将 UITabBarController 添加到情节提要中,并为其指定情节提要 iD。将三组 viewController(及其各自的 navController)中的每一组分配给 tabBarController 中的选项卡项。

 UITabBarController
      |--> UINavigationController --> VC1  ---> VC2  -->
      |--> UINavigationController --> VC1  ---> VC2  -->
      |--> UINavigationController --> VC1  ---> VC2  -->

在您的应用程序委托中,创建一个强大的属性来保存选项卡栏控制器的指针。由于选项卡栏控制器保留指向其所有选项卡项的指针,因此这将处理每组视图控制器的状态。您不必为它们中的任何一个保留单独的指针,并且可以通过 tabBarController 获取对它们的引用viewControllers财产。

@property (strong, nonatomic) UITabBarController* tabVC;

启动时初始化它

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIStoryboard storyBoard = 
        [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];

self.tabVC = [storyBoard instantiateViewControllerWithIdentifier:@"tabVC"];

    //hide the tab bar 
for (UINavigationController* navController in self.tabVC.viewControllers)
    [navController.viewControllers[0] setHidesBottomBarWhenPushed:YES];

    return YES;
}

隐藏选项卡栏的另一种方法是在每个(初始)视图控制器的属性检查器中选中“按下时隐藏底部栏”框。您不必对后续视图控制器执行此操作,只需在该选项卡项中看到的第一个视图控制器即可。

然后,当您需要导航到您的 navController 组之一时……

- (IBAction)openTab:(UIButton*)sender {

    AppDelegate* appDelegate = 
            (AppDelegate*)[[UIApplication sharedApplication] delegate];

    if ([sender.titleLabel.text isEqualToString: @"Option 1"]) {
        appDelegate.tabVC.selectedIndex = 0;
    }else if ([sender.titleLabel.text isEqualToString: @"Option 2"]){
        appDelegate.tabVC.selectedIndex = 1;
    }else if ([sender.titleLabel.text isEqualToString: @"Option 3"]){
        appDelegate.tabVC.selectedIndex = 2;
    }
    [self presentViewController:appDelegate.tabVC
                       animated:YES completion:nil];
}

(本例使用presentViewController,您的应用程序设计可能会以其他方式导航......)

update

如果您想在没有选项卡栏控制器的情况下执行此操作,则可以实例化一个包含指向每个导航控制器的指针的数组:

UINavigationController* ncA =
    [storyboard instantiateViewControllerWithIdentifier:@"NCA"];
UINavigationController* ncB =
    [storyboard instantiateViewControllerWithIdentifier:@"NCB"];
UINavigationController* ncC =
    [storyboard instantiateViewControllerWithIdentifier:@"NCC"];

self.ncArray = @[ncA,ncB,ncC];

这样做的好处是没有标签栏可以隐藏......

那么你的选择看起来像......

- (IBAction)openNav:(UIButton*)sender {

    AppDelegate* appDelegate = 
           (AppDelegate*)[[UIApplication sharedApplication] delegate];
    int idx = 0;
    if ([sender.titleLabel.text isEqualToString: @"option 1"]) {
        idx = 0;
    }else if ([sender.titleLabel.text isEqualToString: @"option 2"]){
        idx = 1;
    }else if ([sender.titleLabel.text isEqualToString: @"option 3"]){
        idx = 2;
    }
    [self presentViewController:appDelegate.ncArray[idx]
                       animated:YES completion:nil];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Storyboard ID 显示各种视图控制器(每个视图控制器都有其各自的导航控制器) 的相关文章

  • 使用 NSSet/NSMutableSet 来过滤对象?

    我已经看到一些有关使用 NSSet NSMutableSet 过滤对象的问题 答案 这些情况使用简单类型的对象 例如NSString or int 以下是用于过滤的代码示例NSString对象 NSSet smallArray NSSet
  • “NSUnknownKeyException”:此类与键的键值编码不兼容

    我收到这条消息 Terminating app due to uncaught exception NSUnknownKeyException reason
  • 安装 Ruby 后,MAC OS X 上的活动开发人员路径无效

    我收到此错误 xcrun 错误 无效的活动开发人员路径 Applications Xcode app 缺少 xcrun Applications Xcode app usr bin xcrun This solution https sta
  • ios 8 核心数据崩溃

    保存时 CoreData 发生崩溃 2014 09 16 09 51 58 273 My app 2678 105246 Terminating app due to uncaught exception NSInvalidArgument
  • Objective-C 实例变量?

    我确信我在这里的困惑只是因为陷入 Java 思维方式 并且不理解 Obj C 在这种情况下有何不同 在Java中 我可以在类中声明一个变量 就像这样 并且每个instance该类的 将会有它自己的 MyClass String myVar
  • 如何等待 webViewDidFinishLoad 完成

    我有一个初始化 webView 的布尔条件 并在 webViewDidFinishLoad 中加载另一个委托 以便在完成完成后触发 但是 由于布尔值在条件 webViewDidFinishLoad 之前返回 因此页面永远不会完全加载 如何确
  • 如何在我的 iOS 项目中添加和执行 .sql 文件?

    我找到了很多关于在 iOS 中使用 SQLite 数据库的教程 但没有找到任何直接引用 sql 文件的内容 谁能告诉我如何将现有的 SQL 数据库链接到我的应用程序 编辑 这是一个 MySQL 转储 我们有一个基于浏览器的抽认卡程序 现在我
  • 在 Mac OS X Yosemite 10.10.1 上包含搜索路径

    我只是为了更改包含搜索路径顺序 我相信 I d like to change the include search path Especially I need usr local include first 但它不会因为重复而改变 我怎样
  • 自动布局和ios5

    我正在使用故事板 我已经使用了自动布局 但它不适用于 ios5 并且会崩溃 所以我想删除它 但是 如何取消选中自动布局 但如果我取消选中自动布局 我如何为 iPhone 4 和 5 设置屏幕 Regards 您可以在 IB 中禁用自动布局
  • XCode:代码覆盖率数据生成失败

    当我尝试运行单元测试时 我在 Objective C 项目中遇到了这个可怕的问题 我已经尝试了以下所有方法 根据各种 SOF 帖子 清除派生数据 删除 Library 中的所有模拟器设置 重新启动 XCode 重新启动MBP 多次重置模拟器
  • 使用反射的属性类型或类

    我想知道是否可以确定对象属性的类或原始类型 获取所有属性名称和值非常容易 所以答案 https stackoverflow com questions 2299841 objective c introspection reflection
  • 如何使用 ZBar 读取器的 scanCrop 属性?

    我正在使用 iPhone 的 ZBar SDK 来扫描条形码 我希望阅读器仅扫描特定的矩形而不是整个视图 为此需要将阅读器的 scanCrop 属性设置为所需的矩形 我很难理解必须设置的矩形参数 有人可以告诉我如果在纵向视图上它的坐标是 我
  • Xcode MyProjectName-Bridging-Header.h 不存在

    我想开始在我的 Objective C 项目中使用 Swift 所以我添加了一个快速类 import Foundation objc class System NSObject objc func printSome println Pri
  • 应用程序发布后,对如何更新 UITableView 上的数据源感到困惑

    阅读文档后 我似乎误解了有关数据管理的一些概念 所以我试图澄清一些方面 如果这篇文章听起来多余和重复 请道歉 我的应用程序有多个 TableView 每个表视图都有一个 pList 形式的数据源 因此 我有几个属性列表用作我的表的数据源 目
  • 获取 Cocoa 中文件的类型

    我成功找到了指定文件的扩展文件类型 JPEG 图像 TIFF 图像等 但我正在寻找更通用的东西 可以对 大类别 中的文件进行分类 如图像 moovies 文本文件等 有没有办法在可可 或 Objective C 中实现这一点 感谢您的帮助
  • 多个 ViewController(containerView?childView?viewController 的实例?)

    我需要在另一个视图之上添加一个新视图 带有 ViewController 用户与这个新视图交互了一段时间 然后我想将其删除 在旧版本的 Xcode 中 我可以将其添加为子视图 我现在收到 EXC BAD ACCESS 错误 我不希望添加的视
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • iPhone UIViewController 中的 UIPickerView

    我有一个 xib 其中添加了一个UIViewController名为德尔塔 delta 下的视图由 delta viewcontroller 控制 而不是由文件所有者控制 在三角洲视图中 我有一个UIViewPicker 我的问题是我正在编
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d
  • 小部件配置在 macOS 上不起作用

    我为我的 iOS 应用程序制作了一个小部件 效果很好 现在我正在将其移植到我的 macOS 应用程序中 但不知何故 小部件配置不起作用 这些项目已显示 但我无法以某种方式选择它们 查看屏幕截图 但请看一下我制作的视频 https youtu

随机推荐

  • python中的加权随机样本

    我正在寻找函数的合理定义weighted sample它不会只返回给定权重列表的一个随机索引 类似于 def weighted choice weights random random Given a list of weights w 0
  • 如何在OSGI框架中在运行时动态加载Java类?

    我们正在项目中执行 POC 其中我们发送基于 SOAP 的请求并相应地从 Web 服务获取 SOAP 响应 我们的目标是在我们的应用程序中利用 Spring 框架提供的 Web 服务模板 客户端 API 根据我们的架构 我们创建一个符合 O
  • 即使安装了 contrib,sift = cv2.xfeatures2d.SIFT_create() 也不起作用

    所以我尝试使用 sift cv2 xfeatures2d SIFT create 它出现了这个错误 cv2 error OpenCV 3 4 3 C projects opencv python opencv contrib modules
  • 在 numpy 中将 3 个一维数组连接在一起

    我将离开 MatLab 转而使用 numpy 总体来说一切顺利 但我正在做噩梦 要找到一种很好的 Pythonic 方法来完成在 MatLab 中可以完成的操作 A 1 0 2 0 3 0 4 0 Column vector B 5 0 6
  • 无法启动 Visual Studio 分析器

    我有 VS 2010 Ultimate 我创建了空的 win32 控制台解决方案 并将其 cpp 文件替换为http pastebin com EQJKJK6T我尝试执行 CPU 采样分析 但由于某种原因我收到以下消息 留言框 无法启动 e
  • 如何避免旋转时重新创建 Activity,同时尊重方向锁定?

    背景 每次旋转设备时 Android 都会销毁当前 Activity 并使用新配置重新创建它 避免重新创建活动的一个简单方法是添加 配置更改 清单中的值 我记得是 屏幕大小 和 方向 问题 如果您使用 configChanges 属性 应用
  • 如何将网页下载到 .NET 中的流中

    我知道这应该是一个基本问题 但我遇到了困难 我希望转到 URL URI 下载结果字符串 就好像我打开了一个文件一样 然后将其取出到 String 变量中 我一直在使用 IO Stream 和 Net httpxxx 但还没有设法让元素以正确
  • Matlab 绘图 - 字体 Zapf Dingbats 将不会渲染

    我有一个 Matlab 程序 需要在图中包含一个平面图标 Zapf Dingbats 40 每次我运行它时 它都会回退到系统字体 我做错了什么吗 这不是确切的代码 但说明了问题 title char 40 fontname ZapfDing
  • UIView animateWithDuration 立即返回

    我正在尝试为嵌入 UIView 中的标签设置动画 这是代码 void displayText NSString text label setText text UIView animateWithDuration 5 0 delay 0 0
  • 带有通配符参数的存储过程

    我有一张桌子 create table user userId varchar 8 not null userName varchar 8 not null insert into user select NAME1 name1 union
  • Highcharts 3.08 具有多个父系列的深入分析

    我正在使用 Highcharts 制作第一个向下钻取图表 我刚刚安装了 3 09 版本 其中内置了向下钻取支持 钻取图表将成为已包含多个图表的页面的一部分 所有图表都有 3 个系列 州 地区 子地区 数据动态填充 问题是钻取模块似乎不支持多
  • 通过代码将stdout重定向到C中的文件

    我正在输出到标准输出 如何通过代码将其重定向到新文件 当我们运行程序时 我们可以像这样重定向 sample gt test txt 在执行示例程序本身时如何做到这一点 C语言编程 您可能想使用freopen 参考示例 include
  • 如何在 LINQ to SQL 中使用WITH(NOLOCK)?

    我们可以像这样使用 SQL SELECT FROM student WITH NOLOCK 如何在不使用 LINQ to SQL 的情况下实现此目的TransactionScope LINQ to SQL 没有任何执行此操作的机制 但您可以
  • 获得焦点和失去焦点事件

    我的 java swing 表单中有 4 个 JTextfield 问题是我需要通过 java 代码而不是使用 Tab 键将焦点从一个 JTextField 移动到另一个 JTextField 如果JTextField2获得了Focus 则
  • 为什么 libmp3lame 在 MP3 的开头添加零?

    我有一个未压缩的 wav 文件 我将其转换为 96k MP3 文件 ffmpeg exe i song wav vn b a 96000 ac 2 ar 48000 acodec libmp3lame y song mp3 输入文件有 63
  • HTML 5 Canvas 似乎重绘了删除的部分

    我创建了以下代码jsfiddle 目标是在单击后从画布上删除一个框 实际发生的情况是 网格被清除并完全重新绘制 删除的框位于原来的位置 只有当所有给定的对象都被删除时 网格才会显示为空 我很困惑 我究竟做错了什么 jQuery functi
  • 测试NG。需要在所有测试之前运行特定方法并在所有测试之后运行特定测试

    使用Selenium TestNG Maven 我想使用 OWASP ZAP 自动测试漏洞 为此 我需要在所有测试之前启动 ZAProxyScanner 在所有测试之前执行方法 public void initZap zapScanner
  • GridView排序和分页

    我想在我的页面上显示简单的 gridview 并为其提供排序和分页功能 单独排序和分页可以正常工作 但两者结合起来就不行了 例如 如果我对第一列进行降序排序 然后转到第二页 那么我会看到第二页数据采用默认排序 升序 我严重依赖这个问题的代码
  • 传递给 onCreate() 方法的 SQLiteDatabase 对象会发生什么?

    几天前 我遇到了一个错误 该错误是由于调用db close 在 的里面onCreate method 还有一些人遇到了类似的问题 这里解决了 无法创建 Android SQLite 数据库 PRAGMA 错误 我现在真的很感兴趣为什么会发生
  • 如何使用 Storyboard ID 显示各种视图控制器(每个视图控制器都有其各自的导航控制器)

    我正在开发我的第一个应用程序 这就是我想要实现的目标 将会有一个包含几个不同选项的菜单 为简单起见 假设它由带有 IBAction 出口的 UIButtons 组成 并且具有随时拉出菜单的功能 每个菜单按钮在按下时应显示不同的导航控制器的内