Storyboard使用心得

article/2025/9/14 16:20:17

        最近接触IOS7新特性,之前项目都是使用xib,没有使用过storyboard,今天就研究下。首先,说下storyboard优缺点,优点a). 流程结构清晰b). 有内置的segue支持c). 方便的实例化ViewController缺点a). 所有的ViewController都在同一个Storyboard里编辑,随着场景的增加,i). XCode打开Storyboard的速度会越来越慢。ii). 所有的ViewController会并列在编辑器左侧,不方便编辑。 b). 无法单独调整每个整场景的生命周期,所有的场景生命周期由storyboard控制,一旦加载了一个场景,除非storyboard卸载,否则无法。(一个超级大bug)。xib的可定制性要大于storyboard,storyboard适用于快速开发小型项目,团队开发感觉不太适合。

现在,说下storyboard的使用,是IOS5的新特性。在xcode5中新建一个Single View Application(也可以新建一全Empty Application) ,如图所示:
AppDelegate.m文件中也会有发现变化,

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

{

   returnYES;

}

这跟以前不一样了!

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

{

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

   // Override point for customization after application launch.

   self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

   self.window.rootViewController =self.viewController;

    [self.window makeKeyAndVisible];

   returnYES;

}

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

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

{

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

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

   self.window.rootViewController = [storyboard instantiateInitialViewController];

    [self.window  makeKeyAndVisible];

   returnYES;

}

接下来打开Main.storyboard文件,默认显示有一个ViewController。现在我们加入一个Navigation Controller,可以直接拖放一个Navigation Controller进来,把原来的ViewController删掉,也可以点击Editor ->Embed In ->Navigation Controller创建,这种方法不用删掉原来的ViewController。如图:

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


取消勾选“Is Initial View Controller”后指向视图控制器的箭头也就消失了。一个Storyboard里只能有一个“初始视图控制器”。如图:



在根控制器中添加一个button,然后继续拖拽一个UITabbarController,接着要做的就是把View Controller和UITabbarController关联起来,有两种方法可以实现,第一种:我们可以直接在Storyboard中完成,按住ctrl从button连接到TabbarController,松开并选择push,这样我们就创建了一个segue(UISotryboardSegue)。如图:


第二种:用代码来实现。(记得把上一步中push类型的segue删除)创建类ViewController中button的点击事件的方法,把UITabbarController的Storyboard Id设置成“second”(4.4版本是Identifier为“second”),效果图如下:


代码如下:

- (IBAction)onClick:(id)sender

{

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

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

    [self.navigationControllerpushViewController:nextViewControlleranimated:YES];

}这样就完成了跳转。

下面将完成另一个目标:手动触发一个segue(Storyboard里无法创建一个通过touch来触发的segue)。拖拽一个UIViewController,把基类设置成"FourthViewController",把TabbarController的第一个分支的ViewController的基类设置成"ThirdViewController",然后按住ctrl从TabbarController的第一个分支连接到新的viewController,同样选择push,把新创建的segue的Identifier设置为"fourth"在此之前应当创建ThirdViewController和FourthViewController两个类文件。在ThirdViewController类中添加如下方法:

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

{

    [selfperformSegueWithIdentifier:@"fourth"sender:nil];

}

在这里也出现了一个小问题,把“fourth”写成了“fourh”,于是就崩掉了,出现了“Receiver has no segue with identifier 'fourh'”提示,经过分析是自己写错了单词,以后大家多注意,可以用CV方式来避免这种问题。

这样就完成 了。效果图如下:


代码下载地址:https://github.com/sany620/Storyboard-IOS7Test


页面切换方法:

xib时:

1 显示模态页面

  调用UIViewController的presentModalViewController方法以模态方式显示页面——

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

使用这种方式进行切换时,新页面不会继承之前页面中的控件,而是只显示自身界面。

当需要从模态页面中返回时,可调用dismissModalViewControllerAnimated方法——

- (void)dismissModalViewControllerAnimated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

2 push到下级页面

当使用导航控制器(UINavigationController)时,可以调用它的pushViewController来转到下级页面——

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 

使用这种方式进行切换时,下级页面会继承之前页面中的控件,如顶部的导航条等。
下级页面的导航条的左侧默认会出现返回按钮。如果想手动返回的话,可以调用UINavigationController的popViewControllerAnimated等方法——

- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated; 

Storyboard时:

1 从Storyboard界面

最简单的办法是——在按钮上拖曳鼠标右键到新页面,创建连线(Segue)。

另外一种是:创建一个从ViewController到新页面的Segue,并对该Segue的Identifier进行命名。然后写代码进行切换,调用UIViewController的performSegueWithIdentifier方法进行切换——

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender NS_AVAILABLE_IOS(5_0);
事例:
[self performSegueWithIdentifier:@"fourth" sender:nil];

2.从纯代码界面

- (id)instantiateViewControllerWithIdentifier:(NSString *)identifier;
事例:
    FourthViewController *fourthVC = [self.storyboard instantiateViewControllerWithIdentifier:@"FourthViewController"];

    fourthVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

    [self presentViewController:fourthVC animated:YES completion:nil];

performSegueWithIdentifier和instantiateViewControllerWithIdentifier区别
performSegueWithIdentifier方法是基于导航的,在下个页面不需要写返回方法,
instantiateViewControllerWithIdentifier方法在返回上个页面时需要写
dismissModalViewControllerAnimated方法。
segue页面间传递数据:
  1. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender  

多个Segue每次动作都会执行这个方法:

在每个ViewController中设置 Storyboard ID, 判断segue的标识符即可,如:

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

{

if ([[segue identifier] isEqualToString:@"XXXXXX"])

{

}

}



参考:http://ryan.easymorse.com/?p=39






http://chatgpt.dhexx.cn/article/8KuaCZtJ.shtml

相关文章

Storyboard 自适应布局

原文链接:http://justsee.iteye.com/blog/2148987 通用的Storyboard 通用的stroyboard文件是通向自适应布局光明大道的第一步。在一个storyboard文件中适配iPad和iPhone的布局在iOS8中已不再是梦想。我们不必再为不同尺寸的Apple移动设备创建不同的storyboard文件&a…

IOS开发之Storyboard应用

(Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图: 现在,你就可以清楚的看到这个应用究竟是干些什么…

Storyboard的使用

创建一个Storyboard工程 storyboard是在ios5中引入的新控件,能够更加清晰、简单的整合多个ViewController的关系,下面主要介绍一下怎么初建一个storyboard的工程。有关storyboard的介绍在后面的文章中提到。 首先利用xcode4.2创建一个新项目,…

Storyboard全解析

原文地址:Storyboard全解析 作者:Capacity 故事版(Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图&…

Storyboard 解析

故事版(Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图: 现在,你就可以清楚的看到这个应用究竟是干…

故事板(Storyboard)

1 使用Storyboard完成各项常见功能 1.1 问题 故事板Storyboard是IOS5开始引入的一个新的系统,将多个视图文件(类似xib文件)集中到一个单独的可视化工作区间,负责创建和管理所有的界面及界面间的跳转,每一个Storyboard中…

什么是故事板?(故事图、Storyboard)(软件显示效果的视觉草图,用于视频创作和广告设计,表达作者的创意)

故事板是软件显示效果的视觉草图,用于视频创作和广告设计,表达作者的创意。20世纪90年代以来,电脑绘制软件渐渐取代了过去的手绘故事板,许多大制作的商业影片,都在拍摄之前用电脑动画模拟的方式创建故事板,…

JSONObject 使用方法详解

JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包,本文给大家介绍jsonobject使用方法相关知识,感兴趣的朋友一起学习吧 1.JSONObject介绍 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转…

JSONObject使用方法及详解

最近自己负责的项目涉及到JSON数据的解析,所以在学习之后讲讲自己的认识及见解,希望对大家有帮助. 首先我们来讲讲JSONObject,JSON的数据格式如下: [ { name1 : { name2: { name3: value1 , name4: value2 } } } , { } ] 从外到里看,例子中就是一个数组&…

JSON与JAVA数据的转换。JSONObject.fromObject()和JSONObject.toBean()

六个架包(666) 首先我们系统中要用到JSON解析,所以要引入这六个架包。饱饱 不引入这六个架包的话,使用JSONObject.fromObject 和 SONObject.toBean会报错,而且有的时候编译器不会告诉你是架包缺少的错误哦&#xff…

使用JSONObject解析

一、JSON数据 1、JSON串访问方式: 2、简介 – JSON(JavaScript Object Notation) 是一种轻量级的数据 交换格式。 – JSON 数据的书写格式: " KEY " : " VALUE " JSON 结构有两种结构: 1、对象(表的一列&…

JSONObject使用方法详解

1.JSONObject介绍 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包。 2.下载jar包 http://xiazai.jb51.net/201707/yuanma/lib_jb51.rar 提供了除JSONObject的jar之外依赖的其他6个jar包,一共7个jar文件 说明:因为工作…

JSONObject使用方法

1.JSONObject介绍 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包。 2.下载jar包 http://files.cnblogs.com/java-pan/lib.rar 提供了除JSONObject的jar之外依赖的其他6个jar包,一共7个jar文件 说明:因为工作中项目…

JSONObject类

(1)是什么? 阿里巴巴提供的一个json快速转换工具类,实现了Map接口,通过Key Value形式存储数据,初始化大小为16,有参构造方法需要传入一个Map。 项目中实际用途: 用于Json转具体的Ob…

JSON, JSONObject, JsonObject

JSON是一个抽象类 JSONObject是一个继承自JSON的类 JSON,JSONObject 和 JsonObject 1. JAR 包不同,对于可以调用的内置方法函数也不同 JSONObject属于 org.json.JSONObject包, JsonObject 属于 com.google.gson.JsonObject包 2. 存储方式不同 JS…

JSONObject

JSONObject JSONObject 介绍 // JSONObject 是一个类 JSONObject jsonObject = new JSONObject(); // JSONObject 只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。 // JSONObject可以很方便的转换成字符串,也…

js构造函数详解

典型的面向对象编程语言(比如C和Java),存在“类”(class)这个概念。所谓“类”就是对象的模板,对象就是“类”的实例。但是,在JavaScript语言的对象体系,不是基于“类”的&#xff0…

JavaScript构造函数

什么是构造函数 构造函数(Constructor)的创建方式和普通函数一样。但通常首字母进行大写,用于和普通函数区分。 但是当一个函数创建好以后,我们并不知道它是不是构造函数(即使函数名的首字母为大写)。只有…

C#构造函数

在C#中,构造函数就是与类具有相同名称的成员函数,通常使用类中的构造函数来初始化类的成员属性。C#中的构造函数有三种: 第一种:实例构造函数。 当使用new关键字创建类的对象时,可以使用实例构造函数来初始化和创建类…

构造函数与拷贝构造函数

拷贝构造函数和构造函数不能分开说,他们都是初始化对象的一种方法。但是我们这里用构造函数辅助说明拷贝构造函数,主要说说拷贝构造函数的声明,用途和使用注意事项。 众所周知,构造函数是一个初始化类对象的函数,即使不…