首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用故事板ID显示各种视图控制器(每个控制器都有各自的导航控制器)

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

Stack Overflow用户
提问于 2013-05-11 20:07:58
回答 2查看 1.2K关注 0票数 1

我正在开发我的第一个应用程序。这是我想要完成的:

将会有一个带有几个不同选项的菜单。为简单起见,假设这是由带有IBAction outlets的UIButtons组成的,并且存在随时弹出菜单的功能。

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

可视化插图(单击以获得更高的分辨率):

请注意,有3个不同的导航控制器/链。根视图控制器(这也是这个简化版本中的菜单)不是它们的一部分。如果用户位于选项2的屏幕3上,然后从菜单中选择选项1,然后从菜单中选择选项2,然后(再次)从菜单中选择选项2,那么他应该看着选项2的屏幕3--就在他离开的地方;当他之前离开导航链时,他正在查看的视图控制器应该回到顶部。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (IBAction)buttonPressed:(id)sender {
    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"View 2"];
    [self presentViewController:controller animated:YES completion:nil];
}

但是,我不知道如何让这两种方法在涉及导航控制器的情况下工作。此外,我不确定这两种方法是不是正确的选择,因为我并不总是希望实例化一个新的视图控制器:当按下菜单按钮时,应该执行检查以查看视图(导航?)具有相应标识符的控制器已被实例化。如果是这样的话,应该简单地将其设置为顶部视图控制器。

总而言之,以下是我的问题:

1)我应该如何实例化和显示嵌入到导航控制器中的视图控制器,最好使用故事板ID?是否使用导航控制器或视图控制器的情节提要ID?

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

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

谢谢你!!

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-12 00:07:03

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

在你的故事板中添加一个UITabBarController,给它一个故事板iD。将三组viewControllers (及其各自的navController)中的每一组都分配给tabBarController中的一个选项卡项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 UITabBarController
      |--> UINavigationController --> VC1  ---> VC2  -->
      |--> UINavigationController --> VC1  ---> VC2  -->
      |--> UINavigationController --> VC1  ---> VC2  -->

在你的应用委托中,创建一个强大的属性来保持标签栏控制器的指针。因为标签栏控制器保持指向它的所有标签项的指针,所以这将照顾到你的每一组viewControllers的状态。您不必为它们中的任何一个保留单独的指针,您可以通过tabBarController的viewControllers属性获取对它们的引用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@property (strong, nonatomic) UITabBarController* tabVC;

在启动时初始化它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (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;
}

隐藏选项卡栏的另一种方法是选中每个(初始) viewControllers的属性检查器中的“推入时隐藏底部栏”框。您不必为后续的viewControllers执行此操作,只需在该选项卡项中看到的第一个就可以了。

然后,当您需要导航到某个navController组时,…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (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,您的应用程序设计可以通过其他方式使用…)

更新

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UINavigationController* ncA =
    [storyboard instantiateViewControllerWithIdentifier:@"NCA"];
UINavigationController* ncB =
    [storyboard instantiateViewControllerWithIdentifier:@"NCB"];
UINavigationController* ncC =
    [storyboard instantiateViewControllerWithIdentifier:@"NCC"];

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

这样做的好处是没有选项卡栏来隐藏…

则您的选择看起来像…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (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];
}
票数 1
EN

Stack Overflow用户

发布于 2013-05-11 20:38:42

1 /您可以在主viewController的viewDidLoad方法中实例化viewController,因此它只实例化一次。

现在,如果你想要显示你的控制器,你最好按下它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (IBAction)buttonPressed:(id)sender {
// Declare your controller in your .h file and do :
controller = [self.storyboard instantiateViewControllerWithIdentifier:@"View 2"];
// Note you can move this line in the viewDidLoad method to be called only 1 time

// Then do not use :
// [self presentViewController:controller animated:YES completion:nil];

// Better to use :
[self.navigationController pushViewController:controller animated:YES];
}

2 /我不确定,但如果您想检查实例是否已经存在,只需检查:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (controller) {
    // Some stuff here
} // I think this checks if controller is initiated.

3 /我知道这不是一个好建议,但我要告诉你不用担心检查你的控制器是否已经存在,因为我认为再次使用这两行可以更容易地访问你的viewController:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
controller = [self.storyboard instantiateViewControllerWithIdentifier:@"View 2"];
[self.navigationController pushViewController:controller animated:YES];

4 /由于特定的样式表,我不确定是否可以在这里使用颜色。

我不确定你的问题是否真的有很好的答案,但我希望这会对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16501270

复制
相关文章
选项卡(TabHost)使用
使用方式: 从TabActivity中用getTabHost()方法获取TabHost,然后设置标签内容
李小白是一只喵
2020/04/24
1.8K0
选项卡
HTML代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>选项卡</title> <link rel="stylesheet" href="css/tab.css" /> </head> <body> <div id="tab"> <ul> <li class="select">视频</li
河湾欢儿
2018/09/05
1.5K0
Tab选项卡
实现步骤: 实现静态UI效果 用传统的方式实现标签结构和样式 基于数据重构UI效果 将静态的结构和样式重构为基于Vue模板语法的形式 处理事件绑定和js控制逻辑 声明式编程 模板的结构和最终显示的效果基本一致 1.html结构 <div id="app"> <div class="tab"> <!-- tab栏 --> <ul> <li class="acti
梨涡浅笑
2020/12/02
2.2K0
选项卡TabHost
1.布局 1 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/tabHost" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" > 6
欢醉
2018/01/22
1.6K0
选项卡TabHost
案例选项卡
案例:实现步骤 1. 实现静态UI效果 用传统的方式实现标签结构和样式 2. 基于数据重构UI效果 将静态的结构和样式重构为基于Vue模板语法的形式 处理事件绑定和js控制逻辑 3. 声明式编程
清出于兰
2020/12/01
1.5K0
案例选项卡
SetTimer在无窗口和有窗口线程的使用
 今天犯了一个粗心的错误,在无窗口线程中,SetTimer中设置计时器ID,而WM_TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID.
雪影
2018/08/02
8280
js实现选项卡
选项卡就是点击按钮切换到相应内容,其实就是点击按钮把内容通过display(block none)来实现切换的。
wfaceboss
2019/04/08
2.8K0
在新窗口打开链接
最近博主再用H+模板时候表单提交和链接都在新窗口打开,没看见target="_blank",一直没查出来,苦恼N久,今天百度了如何用JS css等等实现网页所有链接在新窗口打开,终于找到了原因,因如下代码导致。 代码如下:
雨落凋殇
2019/12/25
2.7K0
Labview选项卡之实现被选择选项卡工作
有些时候,我们做界面,需要好多个界面切换。如果是同一个 VI 里界面切换,一般都是选项卡了。切换不同选项卡就切换界面了。
Gnep@97
2023/08/16
7681
Labview选项卡之实现被选择选项卡工作
html5新特性实现tab选项卡切换
分析代码可以知道,选项卡的class为active的时候,选项卡就被选中,当内容section的style属性为display:block时,内容就被选中
一个淡定的打工菜鸟
2018/09/06
12.9K6
Layui Tab 选项卡
layui-tab layui-tab-title layui-tab-content layui-tab-item
用户5760343
2019/10/24
3.3K0
小程序 — 选项卡
(2)将用户点击传过来的index值赋给data中改变当前的索引值activeIndex
Ewall
2018/09/30
1.6K0
小程序 — 选项卡
使用 jQuery 在新窗口打开外部链接
我们一般都希望在新窗口打开外部链接,这样用户就不需要离开网站就能访问外部链接,但是如果每个外部链接都手工加上新窗口打开的属性(target="_blank")的话,会让人非常抓狂。使用 jQuery,我们只需要几行代码就能在新窗口中打开外部链接。
Denis
2023/04/15
2.7K0
微信小程序----导航栏选项卡(MUI顶部选项卡)
效果图 WXML <import src="../../template/list.wxml"/> <view class="tui-tabbar-content"> <view class="
Rattenking
2021/02/01
1.6K0
微信小程序----导航栏选项卡(MUI顶部选项卡)
【说站】win10系统打开网页不是私密连接怎么解决?
我们平时上网在浏览器内打开某个网址时可能会遇到页面报错提示:“您的连接不是私密连接”,这种情况多是电脑上的时间日期设置的有问题导致证书过期失效或是网站不安全导致的。在您共享敏感信息时在线信息安全十分重要。那win10打开网页不是私密连接要怎么办呢?还不清楚的小伙伴们快跟着小编一起来看看解决方法吧!
很酷的站长
2022/11/24
10.6K0
【说站】win10系统打开网页不是私密连接怎么解决?
WordPress 网站如何有选择性的在新窗口打开链接?
WordPress 网站如何有选择性的在新窗口打开链接?在新窗口打开链接有时还是很有必要,下面这个简单实例,是利用 JQuery实现有选择性的在新窗口打开链接的方法。
主机教程网2bcd.com
2022/10/17
1K0
WPF实现选项卡效果(1)——使用AvalonDock
  公司最近一个项目,软件采用WPF开发,需要实现类似于VS的选项卡(或者是浏览器的选项卡)效果。搜寻诸多资料后,发现很多同仁推荐AvalonDock这款开源控件。在其官方地址下载源码和Demo后,对其进行了初步的研究,初步实现了预期效果。 完整系列   ● 第一部分   ● 第二部分   ● 第三部分 在Git中下载工程源码
全栈程序员站长
2022/09/13
1.6K0
WPF实现选项卡效果(1)——使用AvalonDock
微信小程序开发之选项卡(窗口顶部TabBar)页面切换
微信小程序开发中选项卡.在Android中选项卡一般用fragment,到了小程序这里瞬间懵逼了. 总算做出来了.分享出来看看. 先看效果:
李维亮
2021/07/09
1.3K0
使用 DevTools 新增的 Issues 选项卡发现网页问题
你是否有过被 Chrome 控制台的各种警告和错误支配的恐惧?大量的信息让我们难以找到网页的真正问题以及我们想要的信息。
ConardLi
2020/08/31
1.4K0
使用 DevTools 新增的 Issues 选项卡发现网页问题
点击加载更多

相似问题

防止在新选项卡/窗口中打开页

32

防止php在新选项卡/窗口中打开

12

防止在新选项卡/窗口中打开引导模式窗口

24

使用任何可能的方法在新选项卡(而不是新窗口)中打开

23

在silverlight中是否有任何方法打开带有某些html内容的新选项卡(或弹出窗口或窗口)?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文