标签:选中 转换 bar 代理模式 场景 修改 一个 pat item
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的介绍
标签:选中 转换 bar 代理模式 场景 修改 一个 pat item
原文地址:http://www.cnblogs.com/self-epoch/p/7774183.html