zoukankan      html  css  js  c++  java
  • 故事板(Storyboard)

    1 使用Storyboard完成各项常见功能

    1.1 问题

    故事板Storyboard是IOS5开始引入的一个新的系统,将多个视图文件(类似xib文件)集中到一个单独的可视化工作区间,负责创建和管理所有的界面及界面间的跳转,每一个Storyboard中的单个视图文件称之为场景Scene,可以使用Xcode的Interface Builder来进行编辑。

    本案例将学习如何使用Storyboard完成场景的创建,并且使用两种不同的方式实现Modal模式的跳转,如图-1所示:

    图-1

    1.2 方案

    首先创建一个SingleViewApplication项目,会自动帮我们创建好一个TRViewController类,并且自动带有Storyboard文件,默认情况下Storyboard里面有一个已经创建好的场景,已和TRViewController类绑定。

    另外不用在程序的入口方法中创建Window对象和根视图控制器,StoryBoard会自动帮我们创建。

    其次再新创建一个场景,从对象库中拖放一个视图控制器对象到StoryBoard中即可,并创建一个视图控制器类TRViewController2,继承至UIViewController。

    在Storyboard中选中第二个场景,在右边栏的第三个检查器中修改类名,将TRViewController2和第二个场景绑定。

    然后分别在第一个场景和第二个场景中拖放一个Button控件,在右边栏的第四个检查器中设置好相关属性。

    选中第一个场景中的Button控件,按住Control键往第二个场景拉线,实现Modal方式的页面跳转。给场景二中的Button添加事件方法,通过代码的方式实现界面的回跳。

    最后通过Segue加代码的方式实现界面跳转,在场景一中再拖放一个Button控件并关联成方法。选中场景一上面的黄色圆球按钮,按住Control键往第二个场景上拖拽,释放鼠标选择Modal模式跳转。

    选中Segue对象,在右边栏的检查器四中给Identifier进行赋值,给Segue对象取一个标识“Segue”,identifier是一个NSString类型的属性。

    在TRViewController.m文件中实现Button的事件方法,使用performSegueWithIdentifier:sender:方法实现页面跳转。

    1.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:创建一个带有Storyboard的项目

    首先创建一个SingleViewApplication项目,Xcode会自动帮我们创建好一个TRViewController类,并且自动带有Storyboard文件。

    默认情况下Storyboard里面有一个已经创建好的场景,并且已经和TRViewController类绑定。另外不需要再到程序的入口方法中创建Window对象和根视图控制器对象,StoryBoard会自动帮我们创建,在StoryBoard文件中有一个箭头指向的场景就是程序的根视图控制器,如图-2所示:

    图-2

    步骤二:创建第二个场景并和代码绑定

    在Storyboard中创建一个新场景,从对象库中拖放一个视图控制器对象到StoryBoard中,如图-3所示:

    图-3

    然后创建一个视图控制器类TRViewController2,继承至UIViewController。在Storyboard中选中第二个场景,在右边栏的第三个检查器中修改类名,将TRViewController2和第二个场景绑定在一起,如图-4所示:

    图-4

    步骤三:通过Segue实现界面跳转

    StoryBoard中每个视图上的控件,都和xib文件的操作方式一样,可以直接拖拽摆放在视图上,也同样可以通过拉线的方式关联成IBOutlet,IBCollectionOutlet以及IBAction等属性。

    首先分别在第一个场景和第二个场景中拖放一个Button控件,在右边栏的第四个检查器中设置好相关属性。

    然后选中第一个场景中的Button控件,按住Control键往第二个场景拉线,释放鼠标,在弹出的窗口中选择Modal方式,如图-5所示:

    图-5

    最后给场景二中的Button添加事件方法back:,在该方法中通过代码的方式实现界面的回跳,代码如下所示:

    1. - (IBAction)back:(UIButton *)sender {
    2. [selfdismissViewControllerAnimated:YEScompletion:nil];
    3. }

    这里需要注意返回到第一个界面时,不能再继续使用连线的方式,否则会创建新的视图控制器对象,而不是返回以前的视图控制器。

    步骤四:通过Segue加代码的方式实现界面跳转

    首先在场景一中再拖放一个Button控件并关联成方法goToSecond:。选中场景一上面的黄色圆球按钮,按住Control键往第二个场景上拖拽,释放鼠标选择Modal模式跳转,如图-6所示:

    图-6

    注意此时应该选中的是场景本身,而不再是按钮。然后选中Segue对象,在右边栏的检查器四中给Identifier进行赋值,identifier是Segue对象一个NSString类型的属性,表示Segue的标识,用于区分不同的Segue对象,本案例给Segue对象取一个标识“Segue”,如图-7所示:

    图-7

    在TRViewController.m文件中实现Button的事件方法goToSecond:,在该方法中使用performSegueWithIdentifier:sender:方法实现页面跳转,identifier参数就是刚才设置的Segue的标识,代码如下所示:

     
    1. - (IBAction)goToSecond:(UIButton *)sender {
    2. [selfperformSegueWithIdentifier:@"Segue" sender:nil];
    3. }

    1.4 完整代码

    本案例中,TRViewController.m文件中的完整代码如下所示:

     
    1. #import "TRViewController.h"
    2. @interfaceTRViewController ()
    3. @end
    4. @implementationTRViewController
    5. - (IBAction)goToSecond:(UIButton *)sender {
    6. [selfperformSegueWithIdentifier:@"Segue" sender:nil];
    7. }
    8. @end
     

    本案例中,TRViewController2.m文件中的完整代码如下所示:

     
    1. #import "TRViewController2.h"
    2. @interface TRViewController2 ()
    3. @end
    4. @implementation TRViewController2
    5. - (IBAction)back:(UIButton *)sender {
    6. [selfdismissViewControllerAnimated:YEScompletion:nil];
    7. }
    8. @end
     

    2 将场景嵌入到导航中并进行Push跳转

    2.1 问题

    本案例在StoryBoard中分别使用手动和自动的方式创建带有导航控制器的场景,并实现Push模式的界面跳转,如图-8所示:

    图-8

    2.2 方案

    首先创建一个带有Storyboard的SingleViewApplication项目。先使用手动的方式给场景添加导航控制器:

    1)从对象库拖拽一个NavigationController对象到storyboard中,删除NavigationController自带的视图控制器(默认是一个表视图控制器);

    2)选中NavigationController对象,往自己的视图控制器上拉线,释放鼠标,在弹出的对话框中在选择root view Controller,就完成了添加导航控制器。

    然后将上一步拖拽的NavigationController对象删除,再使用自动嵌入NavigationController的方式给视图控制器添加导航控制器。

    选中需要被导航控制器包含的场景,在Xcode菜单栏中选中Editor选项,然后选中Embed In,最后在弹出的窗口中选中NavigationController即可。

    最后再创建一个新的场景,从对象库拖拽一个视图控制器对象到storyboard中,在上一个场景中拖拽一个跳转按钮,然后选中按钮按住Control键连线到新创建的场景上,在弹出的菜单中选择Push即可实现界面的跳转。

    2.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:使用手动的方式给场景添加导航控制器

    首先创建一个带有Storyboard的SingleViewApplication项目。从对象库拖拽一个NavigationController对象到storyboard中,删除NavigationController自带的视图控制器(默认是一个表视图控制器),如图-9所示:

    图-9

    然后选中storyboard中的NavigationController对象,往自己的视图控制器上拉线,释放鼠标,在弹出的对话框中选择root view Controller,如图-10所示:

    图-10

    最后不要忘了将程序入口的箭头移动到NavigaitonController的前面,表示程序从此处入口,如图-11所示:

    图-11

    步骤二:使用自动的方式给场景添加导航控制器

    先将上一步拖拽的NavigationController对象删除,然后选中需要被导航控制器包含的场景,在Xcode菜单栏中选中Editor选项,然后选中Embed In,最后在弹出的窗口中选中NavigationController即可,如图-12所示:

    图-12

    步骤三:实现Push模式跳转

    首先创建一个新的场景,从对象库拖拽一个视图控制器对象到storyboard中。然后在上一个场景中拖拽一个跳转按钮,在右边栏检查器四设置按钮的相关属性。

    最后选中按钮,按住Control键往新创建的场景上拉线,在弹出的菜单中选择Push即可实现界面的跳转,如图-13所示:

    图-13

    如果此时入口箭头消失了,可以在storyboard中选中NavigationController,然后在右边栏检查器四中的Is Initial View Controller选择框上打钩,如图-14所示:

    图-14

    如果不需要另外写代码,可以不用创建视图控制器类。最后在StoryBoard中完成的界面如图-15所示:

    图-15

    3 给场景添加Title、按钮、ToolBar等

    3.1 问题

    本案例直接在上一个案例的基础上实现,学习如何在Storyboard中给导航栏添加标题和按钮,并设置ToolBar工具条,如图-16所示:

    图-16

    3.2 方案

    首先给导航栏添加标题,选中场景一,双击导航栏的中间区域,即可编辑场景一的导航栏所显示的标题,相当于使用代码给self.title属性赋值,也可以在右边栏的检查器四中编辑标题。场景二也可以通过同样的方式编辑标题。

    然后给导航栏添加左右按钮,选中场景一,直接从对象库中拖拽一个BarButtonItem控件到场景一的NavigationBar的左区域或右区域即可,可以在检查器四中设置BarButtonItem控件的的相关属性。

    最后设置ToolBar工具条,在StoryBoard中可以直接设置显ToolBar,选中NavigationController,在右边栏的检查器四中的shows ToolBar选择框上打勾,然后在具体的界面场景中向ToolBar拖放BarButtonItem。

    3.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:给导航栏添加标题

    首先给导航栏添加标题,选中场景一,双击导航栏的中间区域,即可编辑场景一的导航栏所显示的标题,相当于使用代码给self.title属性赋值,如图-17所示:

    图-17

    或者在右边栏的检查器四中编辑导航栏的标题,如图-18所示:

    图-18

    用同样的方式给场景二的导航栏添加标题。

    步骤二:给导航栏添加左右按钮

    在Storyboard中选中场景一,从对象库中拖拽一个BarButtonItem控件到导航栏的左区域上,如图-19所示:

    图-19

    然后在右边栏的检查器四中设置BarButtonItem的相关属性,BarButtonItem的样式、标题、图片等都可以直接进行设置,如图-20,图-21所示:

    图-20

    图-21

    最后按同样的方式再拖拽一个BarButtonItem控件到导航栏的右区域上,如图-21所示:

    图-21

    在Storyboard中是不能往导航栏拖拽多个左按钮或右按钮的,如果需要放置多个按钮,就只能通过代码的方式。

    步骤三:设置ToolBar工具条

    首先让ToolBar工具条显示出来,在StoryBoard中可以直接设置显示ToolBar,选中NavigationController,在右边栏的检查器四中的shows ToolBar选择框上打勾,如图-22所示:

    图-22

    然后选中场景一,向ToolBar依次拖放BarButtonItem,在右边栏的检查器四中可以设置BarButtonItem的样式,完成效果如图-23所示:

    图-23

    4 将场景嵌入到TabBar

    4.1 问题

    本案例直接在上一个案例的基础上完成,在StoryBoard中分别使用手动和自动的方式创建带有标签控制器的场景,如图-24所示:

    图-24

    4.2 方案

    和操作导航控制器类似,首先从对象库中拖拽一个TabBarController对象到Storyboard中,删除TabBarController自带的视图控制器。

    然后选中TabBarController,按住Control键连线到场景一的NavigaitionController(ToolBar需要隐藏),释放鼠标在弹出的窗口中选择view controllers。

    在场景一的NavigationController上选中TabBar的Item,在右边栏的检查器四中设置相关属性,例如按钮样式、标题,显示图片等。以同样的方式给TabBarController再添加两个子视图控制器。

    最后将上一步拖拽的TabBarController对象删除,再使用自动嵌入TabBarController的方式给视图控制器添加导航控制器。

    选中场景一的导航控制器,在Xcode菜单栏中选中Editor选项,然后选中Embed In,最后在弹出的窗口中选中TabBarController即可。然后以拉线的方式关联其他子视图控制器。

    4.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:使用手动的方式给场景添加标签控制器

    从对象库拖拽一个TabBarController对象到storyboard中,删除TabBarController自带的视图控制器,如图-25所示:

    图-25

    然后选中storyboard中的TabBarController对象,往场景一的NavigationController上拉线,释放鼠标,在弹出的对话框中在选择root view Controller,如图-26所示:

    图-26

    在场景一的NavigationController上选中TabBar的Item,在右边栏的检查器四中设置相关属性,例如按钮样式、标题,显示图片等,如图-27所示:

    图-27

    最后以同样的方式给TabBarController添加两个子视图控制器,并将程序入口的箭头放置到TabBarController的前面,表示程序从此处入口,如图-28所示:

    图-28

    步骤二:使用自动的方式给场景添加标签控制器

    先将上一步拖拽的TabBarController对象删除,然后选中需要被导航控制器包含的场景,在Xcode菜单栏中选中Editor选项,然后选中Embed In,最后在弹出的窗口中选中TabBarController即可,如图-29所示:

    图-29

    然后以拉线的方式关联其他子视图控制器,使用同步骤二相同的方法设置TabBar上Item的属性。

    5 使用segue方式跳转时的传值

    5.1 问题

    Storyboard让界面跳转变得更加的简单,那么同样也会存在界面之间的正向传值和反向传值,本案例使用Segue实现页面之间的跳转和正向传值(反向传值和之前的方法相同),将第一个界面TextField里面的输入内容传递给第二个界面,如图-30所示:

    图-30

    5.2 方案

    首先同样创建好一个SingleViewApplication项目,在Storyboard里面拖放两个视图控制器的场景,分别和两个视图控制器类TRFirstViewController和TRSecondViewController绑定。

    其次在第一个场景中拖放一个TextField控件和一个Button控件,并将TextField关联成私有属性textField。

    在第二个场景中拖放一个Label控件和一个Button控件,并将Label关联成私有属性label,将Button关联成方法back:,该方法用于回跳到第一个界面。

    然后选中场景一中的Button,按住Control键往第二个场景拉线,实现Modal模式的跳转。

    在TRSecondViewController类中定义一个NSString类型的公开属性massage,用于接收传递过来的数据。

    最后在TRFirstViewController.m文件中重写方法prepareForSegue:sender:,该方法会在界面跳转之前被自动调用,Segue参数就是连接两个场景的Segue对象。在该方法内部将textField输入框中的内容赋值给TRSecondViewController的message属性,从而进行传值。

    在TRSecondViewController.m文件中重写方法viewWillAppear:,在此方法中将接收到数据显示到label上;

    5.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:创建项目,搭建场景

    在创建好的Xcode项目中创建两个视图控制器类TRFirstViewController和TRSecondViewControlle,全都继承至UIViewController。

    在Storyboard里面拖放两个视图控制器的场景,分别和两个视图控制器类TRFirstViewController和TRSecondViewController进行绑定。

    其次在第一个场景中拖放一个TextField控件和一个Button控件,并将TextField关联成TRFirstViewController的私有属性textField,代码如下所示:

     
    1. @interfaceTRFirstViewController ()
    2. @property (weak, nonatomic) IBOutletUITextField *textField;
    3. @end

    在第二个场景中拖放一个Label控件和一个Button控件,并将Label关联成TRSecondViewController的私有属性label,将Button关联成方法back:,该方法用于回跳到第一个界面,代码如下所示:

     
    1. //Label的输出口属性
    2. -@interfaceTRSecondViewController ()
    3. @property (weak, nonatomic) IBOutletUILabel *label;
    4. @end
    5. //Button的back:方法
    6. - (IBAction)back:(UIButton *)sender {
    7. [selfdismissViewControllerAnimated:YEScompletion:nil];
    8. }

    步骤二:创建Segue对象,实现界面跳转

    选中场景一中的Button,按住Control键往第二个场景拉线,释放鼠标在弹出的窗口中选择Modal模式,实现界面跳转,如图-31所示:

    图-31

    在TRSecondViewController类中定义一个NSString类型的公开属性massage,用于接收传递过来的数据,代码如下所示:

     
    1. @interfaceTRSecondViewController : UIViewController
    2. @property (nonatomic,strong) NSString *message;
    3. @end

    步骤三:关联代码,实现方法

    首先在TRFirstViewController.m文件中重写方法prepareForSegue:sender:,该方法会在界面跳转之前被自动调用,Segue参数就是连接两个场景的Segue对象,可以通过segue.destinationViewControllerSegue属性获取到TRSecondViewController对象,并将textField输入框中的内容赋值给TRSecondViewController的message属性,从而进行传值,代码如下所示:

     
    1. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    2. //拿到目标VC对象
    3. TRSecondViewController *destination = segue.destinationViewController;
    4. //给destination的公开属性赋值
    5. destination.message = self.textField.text;
    6. }

    最后在TRSecondViewController.m文件中重写方法viewWillAppear:,在此方法中将接收到数据显示到label上,代码如下所示:

    1. -(void)viewWillAppear:(BOOL)animated {
    2. [superviewWillAppear:animated];
    3. self.label.text = self.message;
    4. }

    5.4 完整代码

    本案例中,TRFirstViewController.m文件中的完整代码如下所示:

     
    1. #import "TRFirstViewController.h"
    2. #import "TRSecondViewController.h"
    3. @interfaceTRFirstViewController ()
    4. @property (weak, nonatomic) IBOutletUITextField *textField;
    5. @end
    6. @implementationTRFirstViewController
    7. //父类中的方法,此方法会在Segue跳转之前自动调用
    8. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    9. //拿到目标VC对象
    10. TRSecondViewController *destination = segue.destinationViewController;
    11. //给destination的公开属性赋值
    12. destination.message = self.textField.text;
    13. }
    14. @end

    本案例中,TRSecondViewController.h文件中的完整代码如下所示:

     
    1. #import<UIKit/UIKit.h>
    2. @interfaceTRSecondViewController : UIViewController
    3. @property (nonatomic,strong) NSString *message;
    4. @end
     

    本案例中,TRSecondViewController.m文件中的完整代码如下所示:

     
    1. #import "TRSecondViewController.h"
    2. @interfaceTRSecondViewController ()
    3. @property (weak, nonatomic) IBOutletUILabel *label;
    4. @end
    5. @implementationTRSecondViewController
    6. -(void)viewWillAppear:(BOOL)animated {
    7. [superviewWillAppear:animated];
    8. self.label.text = self.message;
    9. }
    10. - (IBAction)back:(UIButton *)sender {
    11. [selfdismissViewControllerAnimated:YEScompletion:nil];
    12. }
    13. @end
     

    6 使用代码的方式实现界面跳转

    6.1 问题

    使用Segue实现界面跳转的好处就是方便、灵活。但是程序中经常也会用到手动方式跳转界面。本案例直接在上一个案例的基础上实现,使用代码的方式实现storyboard场景之间的跳转,以及storyboard和xib之间的跳转,如图-32所示:

    图-32

    6.2 方案

    首先让场景一嵌入NavigationController,然后在场景一上面拖拽一个Button控件,并将标题命名为“goToSecondVCByCode”,将按钮关联成TRFirstViewController的方法goToSecondVC:。

    其次选中场景二,在右边栏的检查器三中的设置Storyboard ID值,给场景二命名一个标识为“SecondVC”。

    然后在TRFirstViewController.m文件中实现goToSecondVC:方法,该方法内部通过Storyboard的instantiateViewControllerWithIdentifier:方法获取到TRSecondViewController对象,并通过push方法实现跳转。

    最后实现Stroyboard跳转到xib,创建一个带有xib的视图控制器类TRThirdViewController,在xib中拖放一个回跳按钮,关联成TRThirdViewController的方法backToFirst:,实现该方法通过dismiss方法回跳到第一个界面。

    在场景一上面拖拽一个Button控件,并将标题命名为“goToThirdXibByCode”,将按钮关联成TRFirstViewController的方法goToThirdVC:,在该方法内通过initWithNIbName获取到TRThirdViewController对象,并通过push方法实现界面跳转。

    6.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:使用代码实现场景一和场景二之间的跳转

    首先让场景一嵌入NavigationController,然后在场景一上面拖拽一个Button控件,并将标题命名为“goToSecondVCByCode”,并将按钮关联成TRFirstViewController的方法goToSecondVC:。

    然后选中场景二,在右边栏的检查器三中的设置Storyboard ID值,给场景二命名一个标识为“SecondVC”,如图-33所示:

    图-33

    最后在TRFirstViewController.m文件中实现goToSecondVC:方法,该方法内部通过Storyboard的instantiateViewControllerWithIdentifier:方法获取到TRSecondViewController对象,并通过push方法实现跳转,代码如下所示:

    1. - (IBAction)goToSecondVCByCode:(UIButton *)sender {
    2. TRSecondViewController *secondVC = [self.storyboardinstantiateViewControllerWithIdentifier:@"SecondVC"];
    3. secondVC.message = self.textField.text;
    4. [self.navigationControllerpushViewController:secondVCanimated:YES];
    5. }

    步骤二:实现从Storyboard文件和Xib文件之间的跳转

    storyboard和xib是可以一起工作,从storyboard可以直接跳转到xib文件(仅限push跳转方式),操作方式和以前完全相同。

    首先创建一个带有xib的视图控制器类TRThirdViewController,继承至UIViewController。

    然后在xib文件中拖放一个回跳按钮,并将按钮关联成TRThirdViewController的方法backToFirst:,实现该方法,代码如下所示:

     
    1. - (IBAction)backToFirst:(UIButton *)sender {
    2. [selfdismissViewControllerAnimated:YEScompletion:nil];
    3. }

    最后在场景一上面拖拽一个Button控件,并将标题命名为“goToThirdXibByCode”,将按钮关联成TRFirstViewController的方法goToThirdVC:,在该方法内通过initWithNIbName获取到TRThirdViewController对象,并通过push方法实现界面跳转,代码如下所示:

     
    1. - (IBAction)goToThirdXibByCode:(UIButton *)sender {
    2. TRThirdViewController *thirdVC = [[TRThirdViewControlleralloc]initWithNibName:@"TRThirdViewController" bundle:nil];
    3. [self.navigationControllerpushViewController:thirdVCanimated:YES];
    4. }

    6.4 完整代码

    本案例中,TRFirstViewController.m文件中的完整代码如下所示:

     
    1. #import "TRFirstViewController.h"
    2. #import "TRSecondViewController.h"
    3. #import "TRThirdViewController.h"
    4. @interfaceTRFirstViewController ()
    5. @property (weak, nonatomic) IBOutletUITextField *textField;
    6. @end
    7. @implementationTRFirstViewController
    8. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    9. TRSecondViewController *destination = segue.destinationViewController;
    10. destination.message = self.textField.text;
    11. }
    12. - (IBAction)goToSecondVCByCode:(UIButton *)sender {
    13. TRSecondViewController *secondVC = [self.storyboardinstantiateViewControllerWithIdentifier:@"SecondVC"];
    14. secondVC.message = self.textField.text;
    15. [self.navigationControllerpushViewController:secondVCanimated:YES];
    16. }
    17. - (IBAction)goToThirdXibByCode:(UIButton *)sender {
    18. TRThirdViewController *thirdVC = [[TRThirdViewControlleralloc]initWithNibName:@"TRThirdViewController" bundle:nil];
    19. [self.navigationControllerpushViewController:thirdVCanimated:YES];
    20. }
    21. @end
     

    7 完成乐库项目中的静态表

    7.1 问题

    使用storyboard实现静态表视图比xib方式更简单、更方便,更灵活。本案例使用Storyboard重新完成乐库项目中的“更多”界面,如图-34所示:

    图-34

    7.2 方案

    首先同样创建一个SingleViewApplication项目,将Storyboard中原有的场景删除,然后从对象库中拖拽一个TableViewController的对象到Storyboard中,该表视图控制器就是该程序的根视图控制器。

    其次让TableViewController嵌入NavigationController,在Storyboard中选中TableView,然后在右边栏的第四个检查器中,将content属性设置为Static Cells即将表视图设置为静态,可以直接在storyboard的场景中操作表视图的表头视图、分区和单元格。

    然后根据界面需要直接在表视图的表头视图、分区和单元格上拖拽所需要的视图和控件。

    再创建一个表视图控制器类TRMusicTableViewController,和Storyboard中的场景进行绑定,将TableView的三问方法删除,不再需要手动实现。

    最后在Storyboard中通过Segue实现点击单元格跳转和点击辅助视图跳转。

    7.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:创建静态表视图场景

    首先在创建好的Xcode项目中,将Storyboard中原有的场景删除,然后从对象库中拖拽一个TableViewController的对象到Storyboard中,该表视图控制器就是该程序的根视图控制器,如图-35所示:

    图-35

    然后让TableViewController嵌入NavigationController,在Storyboard中选中TableView,然后在右边栏的第四个检查器中,将content属性设置为Static Cells即将表视图设置为静态,将Sections设置为3,表示有三个分区,如图-36所示:

    图-36

    步骤二:表头视图、分区和单元格

    在storyboard中可以直接操作静态表视图的表头视图、分区和单元格,包括拖放视图和控件,设置坐标和宽高,还可以直接复制粘贴。

    首先设置表头视图,直接拖放一个View控件到TableView中,注意要摆放到表头视图所在的位置(在单元格的前面),如图-37所示:

    图-37

    在View视图界面上直接拖放所需要的控件,并在右边栏的检查器中设置各个控件的相关属性,如图-38所示:

    图-38

    其次设置每个TableViewCell,本案例中有三个分区,第一个分区何第二个分区都有三个单元格,第三个分区有一个单元格。每个分区的单元格都是拖放的一个TableViewCell对象,先设置前两个分区的单元格。

    选中需要编辑的单元格,在右边栏的第四个检查器中可以设置单元格的各种属性,包括单元格的样式,辅助视图的样式,分隔线的样式,图片等,如图-39所示:

    图-39

    然后根据界面需求直接将对象库中的控件拖放到TableViewCell的ContentView中,其中第二个分区的第二个单元格还需要自定义辅助视图,在Storyboard中自定义辅助视图也很简单,将一个Switch控件拖放到场景中,但不要放进视图控制器中,如图-40所示:

    图-40

    选中场景中TableViewCell,在右边栏的检查器六中(或选中TableViewCell点右键),连接accessoryView到该控件,如图-41所示:

    图-41

    第一分区和第二分区的tableViewCell设置完成后,Storybaord中的界面如图-42所示:

    图-42

    接下来设置第三个分区的单元格,第三个分区的单元格只有一个,但是单元格的高度是自定义的,首先选中单元格,在右边栏的检查器四中将style设置为Custom,在检查器五中设置单元格的高度,如图-43所示:

    图-43

    然后调整整个TableView的高度,选中场景在右边栏的检查器四中将Size 设置为Freeform,如图-44所示:

    图-44

    再选中tableView,在检查器五中设置TableView的高度,如图-45所示:

    图-45

    最后在tableViewCell的ContentView上拖放界面所需要的控件,并设置相关属性,最后完成的效果如图-46所示:

    图-46

    步骤三:删除三问方法

    创建一个表视图控制器类TRMusicTableViewController,继承至UITableViewController,注意不要再带有xib文件,将TRMusicTableViewController和Storyboard中的场景进行绑定,如图-47所示:

    图-47

    然后在TRMusicTableViewController.m文件中删除自动生成的三问协议U方法,通过Storyboard搭建的静态表视图不在需要通过代码加载数据,Storyboard会自动帮我们完成创建,可以根据程序需要实现表视图其他的委托事件的响应方法,例如didSelectRowAtIndexPath:方法。

    步骤四:通过Segue实现跳转

    在Storyboard中点击单元格Cell跳转和点击辅助视图AccessoryView跳转都可以通过Segue来实现,不需要额外写代码。

    首先在storyboard中另外拖放两个场景,然后选中第一个分区的第一个单元格,按住Control键往第二个场景上拖拽,释放鼠标选Selection Segue选项下的Push模式即完成通过点击单元格跳转,如图-48所示:

    图-48

    再次选中第一个分区的第一个单元格,按住Control键往第三个场景上拖拽,释放鼠标,这次选择Accessory Action选项下的Push模式即完成通过点击单元格的辅助视图完成跳转,如图-49所示:

  • 相关阅读:
    attempt to write a readonly database错误的解决(C#,SQLite) ..
    .net中正则表达式的客户端验证javascript
    WinForm : 利用webBrowser完成填充数据并 自动登陆某网站。。。。。。。
    获取一个网页数据返回的编码类型是gzip,解压后,网页中包含的中文字段变成了乱码,只需要把编码更改为BIG5 ,繁体字就正常显示了!
    将 windows程序(exe程序)运行为windows服务 !!!
    Asp.Net2.0 如何设置 GridView 合并行或列?
    奖金不兑现,我该怎么办?
    GridView二层表头与三层表头的设计。。。。。。。。。。。。。。。。。。。。。。。。
    C# 一个多线程操作控件的例子.#######
    SQL SERVER 2000 中的标识值获取函数 !!!!
  • 原文地址:https://www.cnblogs.com/52190112cn/p/5049388.html
Copyright © 2011-2022 走看看