XCode学习随笔04--Storyboard配置初体验

2024-06-02 13:38

本文主要是介绍XCode学习随笔04--Storyboard配置初体验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


http://blog.sina.com.cn/s/blog_63fa2cac01018ypp.html


Storyboard是iOS5的新特性。使用Storyboard可以更方便的管理应用的界面,同时为视图间的跳转提供了清晰的脉络。

任何时候你都可以在你的项目中添加Storyboard,不管你创建项目的时候有没有勾选“UsbStoryboard”选项,如下图所示。

如果你创建的时候勾选了该选项,那么恭喜你,你已经有了一个Storyboard,并且被设为了MainStoryboard,如下图所示。


同时你的代理类是这样的:

- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

return YES;

}


这跟以前可大不一样了!这是因为程序会自动加载Main Storyboard。如果你把上面的MainStoryboard项清空了,那我们的MainStoryboard.storyboard就是一个孤立的文件了,你必须手动加载它,所以上面的代码也得改一改,如下:

- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];

UIStoryboard *storyboard =[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

self.window.rootViewController =[storyboard instantiateInitialViewController];

[self.window makeKeyAndVisible];

return YES;

}


上面加粗的两句比较重要,前一句是从文件创建UIStoryboard实例对象,后一句则是从这个对象里获取“初始视图控制器”(一个storyboard里只可以设置一个初始视图控制器,相当于这个storyboard的入口,后面还会说到)。但如果你创建项目的时候没有勾选“Use Storyboard”项,那你就要手动添加Storyboard了,如下图所示。



手动创建的Storyboard和自动创建的没有任何不同,打开我们刚刚创建的Storyboard,里面什么都没有,我们不妨拖拽一个NavigationController到里面。



可以看到我们一次拖出了两个视图控制器,这是因为NavigationController需要一个rootViewController。注意我标注的两个小箭头,左边的代表这是一个“初始视图控制器”,右边的代表两个视图控制器之间的关系。选中视图控制器可查看属性。



取消勾选“Is Initial ViewController”后指向视图控制器的箭头也就消失了。再次说一下,一个Storyboard里只能有一个“初始视图控制器”。

下面要做的是在根控制器中添加一个button,然后继续拖拽一个ViewController,点击button新ViewControllerpush进来。

首先添加button,就跟使用IB一样。这次我们拖拽一个UITabbarController,这时如下图所示。

接下来有两种方法:第一种:我们可以直接在Storyboard中完成,按住ctrl从button连接到TabbarController,松开并选择push,这样我们就创建了一个segue(UISotryboardSegue)。

保存并运行



我们没有写任何代码就已经完成了一个简单的框架。

下面是第二种方法:我们准备用代码来实现。(记得把上一步中push类型的segue删除。)首先创建类FirstViewController(Subclass ofUIViewController),然后将RootViewController的底层类改为FirstViewController,如下图。


继续选中TabbarController,并设置Identifier为“second”。



在FirstViewController.m中添加下面的方法并连接到button。

- (IBAction)pressed

{

UIStoryboard *board=[UIStoryboardstoryboardWithName:@"MainStoryboard" bundle:nil];

UITabBarController*nextViewController =[boardinstantiateViewControllerWithIdentifier:@"second"];

[self.navigationControllerpushViewController:nextViewController animated:YES];

}

加粗的代码展示了如何使用Identifier从Storyboard中获取指定的视图控制器。保存并运行,效果和前一种方法完全相同。

下面我们将完成另一个目标:手动触发一个segue。(Storyboard里无法创建一个通过touch来触发的segue。)

拖拽一个UIViewController,按住ctrl从TabbarController的第一个分支连接到新的viewController,同样选择push。



选择刚刚创建的segue并设置Identifier为“touch topush”,然后设置新viewController的Identifier为“third”。(Identifier只是一个名称没有实际意义,可以随便设置。)

添加新类SecondViewController(Subclass ofUIViewController),选中第一个分支并设置其底层类为SecondViewController。然后添加如下方法。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event

{

[selfperformSegueWithIdentifier:@"touch to push"sender:nil];

}

明白这个方法后就可以用任何类型的事件去触发我们在Storyboard中创建的segue了。

继续下一个目标:在segue被触发的时候传递参数到目标视图控制器。

删除TabbarController的第二个分支,拖拽一个UITableViewController,按住ctrl从TabbarController连接到UITableViewController,松开并选择relationship。选中cell设置Identifier为“cell”。然后再拖拽一个UIViewController,并添加一个UILabel。作如下操作。



添加类ThirdViewController(Subclass ofUITableViewController)和类FourthViewController(Subclass ofUIViewController),分别设置为最后两个视图控制器的底层类。

ThirdViewController.m

- (NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section

{

return 20;

}

- (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *identifier =@”cell“;

UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:identifier];

if (cell == nil) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:identifier];

}

cell.textLabel.text = [NSStringstringWithFormat:@"%d",indexPath.row];

return cell;

}

- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender

{

//这里我很谨慎的对sender和目标视图控制器作了判断

if ([senderisKindOfClass:[UITableViewCell class]]) {

if ([segue.destinationViewControllerisKindOfClass:[FourthViewController class]]) {

NSIndexPath *indexPath =[self.tableView indexPathForCell:sender];

FifthViewController*nextViewController = segue.destinationViewController;

nextViewController.string = [NSStringstringWithFormat:@"%d",indexPath.row];

}

}

}

FourViewController.h

@interface FifthViewController : UIViewController

{

IBOutlet UILabel *label;

}

@property (nonatomic,strong) NSString *string;

FourthViewController.m

@synthesize string;

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

label.text = self.string;

}

segue包含属性sourceViewControllerdestinationViewController。segue在触发后但还未执行的时候会调用sourceViewController的prepareForSegue:sender:方法,sender是segue的起始点,可以是button、cell等等。这是你传递参数最好的时机,你可以利用sender参数来找到是哪个cell被点击,利用segue参数来获取源视图控制器对象和目标视图控制器对象,这样你就有足够的信息来传递参数了。

保存并运行


这篇关于XCode学习随笔04--Storyboard配置初体验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024119

相关文章

jdk1.8的Jenkins安装配置实践

《jdk1.8的Jenkins安装配置实践》Jenkins是一款流行的开源持续集成工具,支持自动构建、测试和部署,通过Jenkins,开发团队可以实现代码提交后自动进行构建、测试,并将构建结果分发到测... 目录Jenkins介绍Jenkins环境搭建Jenkins安装配置Jenkins插件安装Git安装配

Nginx之https证书配置实现

《Nginx之https证书配置实现》本文主要介绍了Nginx之https证书配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录背景介绍为什么不能部署在 IIS 或 NAT 设备上?具体实现证书获取nginx配置扩展结果验证

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

springboot的controller中如何获取applicatim.yml的配置值

《springboot的controller中如何获取applicatim.yml的配置值》本文介绍了在SpringBoot的Controller中获取application.yml配置值的四种方式,... 目录1. 使用@Value注解(最常用)application.yml 配置Controller 中

springboot中配置logback-spring.xml的方法

《springboot中配置logback-spring.xml的方法》文章介绍了如何在SpringBoot项目中配置logback-spring.xml文件来进行日志管理,包括如何定义日志输出方式、... 目录一、在src/main/resources目录下,也就是在classpath路径下创建logba

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点