转载自:http://www.dasheyin.com/liu_bu_wan_cheng_tiao_zhuan_delegate_fang_fa.html
在教程《iOS开发教程:Storyboard全解析-第二部分》中,我讲解了如何使用iOS中的delegate,但是有人写信觉得步骤不是很清楚,所以我在这里单独写一个清晰版的。
这个教程就是单独分出来,讲解如何做一个delegate+segue的跳转方法的,步骤如下:
第一步,从起始的控件做一条联线(segue)到目标场景。
如图
第二步,将这个联线制定一个独特的Identifier。
单机这个segue,在右边的inspector里面修改。
第三步,为目标场景制作一个代理(delegate)方法。
首先,在第二个场景(目标场景)的M文件中加入下面的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#import <UIKit/UIKit.h> @class secondViewController; @protocol SecondViewControllerDelegate <NSObject> - (void)secondViewControllerDidJump: (secondViewController *)controller; @end @interface secondViewController : UITableViewController @property (strong,nonatomic) NSArray *choices; @property (nonatomic, weak) id <SecondViewControllerDelegate> delegate; - (IBAction)jump:(id)sender; @end
这些代码制作并声明了了一个代理,还声明了一个IBAction用来进行delegate的跳转。
第四步,在Cancel和Done按钮,以及所有其他你需要和原始场景交流的地方调用代理方法。
将下列代码加入第二个场景的M文件中。
1 2 3 4 5 6 7 8 9 10
- (IBAction)jump:(id)sender { [self.delegate secondViewControllerDidJump:self]; }
这将按下按钮的动作转向了代理方法。
之后在Storyboard中,用连线的方法连接按钮和IBAction,如图:
第五步,在原始场景执行代理方法,这将会在用户按下按钮后关闭场景。
将下面的代码加入到第一个场景(原始场景)的M文件中。
1 2 3 4 5 6 7 8 9 10 11 12 13
- (void)secondViewControllerDidCancel: (secondViewController *)controller { [self dismissViewControllerAnimated:YES completion:nil]; }
这段代码是真正关闭第二个场景的代码,这是iOS5的新方法。
然后,在第一个场景的H文件中,把改ViewController声明为遵循我们创建的代理协议
1
@interface delegateViewController : UIViewController<SecondViewControllerDelegate>
第六步,在原始场景执行prepareForSegue方法。
在第一个场景的M文件中加入下面的代码,这些代码真正的将第二个场景会转到第一个场景。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"AddPlayer"]) { UINavigationController *navigationController = segue.destinationViewController; secondViewController *SecondViewController = [[navigationController viewControllers] objectAtIndex:0]; SecondViewController.delegate = self; } }
最后的效果是这样的:
请注意,要让上面的代码发挥作用你的storyboard必须是这样的: