Xcode -(OC版)Storyboard教程 1.5:Segues的介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode -(OC版)Storyboard教程 1.5:Segues的介绍相关的知识,希望对你有一定的参考价值。

1 - 现在,让我们创建一个场景使用户可以自己增加新的选手进入列表,在 Player 界面中拖入一个 Bar Button,放置在导航栏的右侧,在属性监视器中将它的 System Item 改为『add』,这样它就会显示一个加号的按钮:当用户点击这个按钮时,它就会弹出一个新的场景让用户对新的内容进行编辑或添加

技术分享

 

2 - 在编辑器中拖入一个新的 Table View Controller,放置在 Players 场景的右边,然后按住 ctrl,拉动加号键到新的场景中,放开鼠标之后,会出现如下选项

技术分享

3 - 选中 Modal,你可以注意到出现了一种新的箭头形式

技术分享

4 - 这样,这个场景就会自动和这个按钮建立联系,从而自动归入 Navigation ,这种链接形式被官方称为 segue(pronounce: seg-way

注: - segue 表面翻译是联线的意思,其实它的意思是转换,这它表示从一种场景转换到另外一种场景中,之前我们使用的连接都是描述一种场景包含另一种场景的。而对于联线来说,它会改变屏幕中显示的内容,而且必须由交互动作触发:如轻点,或其他手势

   - 联线真正了不起的地方在于:你不再需要写任何代码来转入一个新的场景,也不用在将你的按钮和 IBAction 连接到一起,我们刚才做的,直接将按钮和场景链接起来,就能够完成这项工作

5 - 运行这个app,按下 + 键,会发现出现了一个新的列表

 技术分享          技术分享

            点『+』击前                         点『+』击后

说明:这种叫做 『modal』 segue(模态转换),新的场景完全盖住了旧的那个。用户无法再与上一个场景交互,除非先关闭这个场景,过一会我们会讨论 『push』 segue,这种 segue 会把场景推入导航栈

6 - 联线只能够把你送到新的场景,你要是想回来,就得使用 delegate pattern(代理模式)。我们必须首先给这个新的场景设置一个独有的类,新建一个继承 UIViewController,命为 『PlayerDetailsViewController』

7 - 为了把它和 storyboard 相连,回到 MainStoryBoard,选择新建的那个 Table View Contrller,将他的类设置为 PlayerDetailViewController,千万不要忘记这一步,这很重要

8 - 做完这一步之后,把新场景的标题改为『Add Player』,分别加入『Done』和『Cancel』两个导航栏按钮,完成之后应该是这个样子

技术分享

9 - 修改 PlayerDetailsViewController.h 如下

 1 #import <UIKit/UIKit.h>
 2 @class PlayerDetailsViewController;
 3 @protocol PlayerDetailsViewControllerDelegate <NSObject>
 4 - (void)playerDetailsViewControllerDidCancel:(PlayerDetailsViewController *)controller;
 5 - (void)playerDetailsViewControllerDidSave:(PlayerDetailsViewController *)controller;
 6 
 7 @end
 8 
 9 @interface PlayerDetailsViewController : UIViewController
10 
11 @property (nonatomic,weak) id <PlayerDetailsViewControllerDelegate> delegate;// 代理
12 
13 - (IBAction)cancel:(id)sender;// 取消按钮
14 - (IBAction)done:(id)sender;// 确认按钮
15 
16 @end

说明:这会声明一个新的代理机制,当用户点击 Cancel 或者 done 按钮时,我们将用它来交互 Add Player 场景和主场景通讯

10 - 回到故事版编辑器,将 Cancel 和 Done 按钮分别与动作方法连接

技术分享

11 - 在 PlayerDetailsViewController.m,加入如下代码

1 - (IBAction)cancel:(id)sender{
2     [self.delegate playerDetailsViewControllerDidCancel:self];
3 }
4 
5 - (IBAction)done:(id)sender {
6     [self.delegate playerDetailsViewControllerDidSave:self];
7 }

说明:① 这是两个导航栏按钮要使用的方法,现在只需要让代理知道我们刚才加入了代码,而真正关闭场景只是代理的事情

   ② 一般来说一定要为代理制定一个对象参数,这样它才知道向那里发送信息

12 - 现在我们已经为 PlayerDetailsViewController 设置了一个代理协议,我们需要将这个协议的实现方法(implement)写在什么地方,很明显应该写在 PlayerViewController ;因为这个 vc 代表了 Add Player 场景。在PlayersViewController.h 中加入如下代码

1 #import <UIKit/UIKit.h>
2 #import "PlayerDetailsViewController.h"
3 @interface PlayersViewController : UITableViewController<PlayerDetailsViewControllerDelegate>// 接受代理
4 @property(nonatomic,strong)NSMutableArray *players;
5 
6 @end

13 - 在 PlayersViewController.m 的加入代码

 


以上是关于Xcode -(OC版)Storyboard教程 1.5:Segues的介绍的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 4.6 和 Xcode 5 一起安装

使用 xcode 10 后 Xcode 9 找不到资产

我是不是需要卸载 Xcode 4 才能安装 Xcode 5?

Xcode 9 和 Xcode 服务器:用户未登录

XCode 4、Armadillo 和 XCode 标准库

将 XIB 从 Xcode 5 降级到 Xcode 4.6