前言:
正常情况下,一个页面会有一个Controller类和一个View类组成。View视图中想要使用父类Controller中的方法需要与父类Controller设置一个协议。页面的跳转是从第一个控制器FirstController跳转到第二个控制器SecondController.
iOS页面的跳转和返回的实现,父类FirstController与子类FirstView之间的协议定义,实现子类能够使用父类中定义的方法。FirstController是FirstView的控制器,共同实现的是一个页面视图。
接下来看一下操作就明白了:
一、步骤流程:
**
下面所示代码都是在对应的.m文件中实现!
**
1、在FirstView中设置第一个按钮btn_fisrt
UIButton *btn_fisrt = [UIButton new];
[btn_fisrt setBackgroundImage:[UIImage imageNamed:@"fk_play"] forState:0];//fk_play是背景图片名字
[btn_fisrt addTarget:self action:@selector(to_second1) forControlEvents:UIControlEventTouchUpInside];//selector后面是响应方法
butt_1.frame = CGRectMake(0, 0,100,100);//按钮位置
[self.view addSubview:btn_fisrt];
2、在FirstController中实现跳转方法,presentViewController:second是实现跳转到second
-(void)to_second{
SecondController *second = [SecondController new];//初始化第二个控制器
second.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:second animated:YES completion:nil];
}
3、在SecondView中创建第二个按钮btn_second实现返回功能
UIButton *btn_second = [UIButton new];//初始化
[btn_second setBackgroundImage:[UIImage imageNamed:@"ea_menu"] forState:0];//添加按钮背景图片
[btn_second addTarget:self action:@selector(re_first1) forControlEvents:UIControlEventTouchUpInside];//selector后面是响应方法
btn_second.frame = CGRectMake(0, 0,100,100);//按钮位置
[self addSubview:btn_second];
4、在SecondController中实现返回页面方法
-(void)re_first{
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"dismiss成功,从SecondController返回到FirstController");
}];
}
在这里已经把基本的方法跟控件写好了,这时候我们开始写父子类之间的协议,让FirstView能够调用父类FirstController中的to_second方法,SecondView能够调用父类SecondController中的re_first方法.
二、实现父子类的协议:
(1)我们先实现第一个视图的协议
1.FirstView.h文件,定义协议
@protocol FirstViewDelegete <NSObject>//FirstViewDelegete是自定义的协议名
@optional
//协议中的方法,与FirstController的跳转方法to_second名字对应
-(void)to_second;
@end
@interface FirstView : UIView
//让子视图FirstView遵从协议
@property(nonatomic,weak)id <FirstViewDelegete>deledete;
@end
2.FirstView.m文件,在头部添加这些让FirstView遵从协议(自己对比区别多了哪些)
#import "FirstView.h"
#import "FirstController.h";
@interface FirstView()<FirstViewDelegete>//<FirstViewDelegete>表示遵从FirstViewDelegete协议
@end
@implementation FirstView
//后面的代码我就不全部复制出来了,需要添加就这几行
3.FirstController.m文件,让父类FirstController遵从协议
#import "FirstController.h"
#import "FirstView.h"
#import "SecondController.h"
@interface FirstController ()<FirstViewDelegete>
@property(nonatomic,strong)FirstView *firstView;
@end
@implementation FirstController
//子类视图在父类中软初始化
- (FirstView *)firstView{
if(!_firstView){
_firstView = [FirstView new];
_firstView.deledete = self;//子类遵从协议
}
return _firstView;
}
4.最后一步、回到FirstView.m文件,定义步骤第一步中的相应方法to_second1,to_second定义在协议self.deledete中。
-(void)to_second1{
if ([self.deledete respondsToSelector:@selector(to_second)]) {
[self.deledete to_second];
}
NSLog(@"跳转成功");
}
到这里就实现第一个视图的协议了,可以实现页面跳转,但是还要实现第二个视图的协议完成页面返回功能。
(2)我们先实现第二个视图的协议
步骤跟第一个视图定义协议的流程一样
在SecondView.h文件,这里的协议要delegate1,跟上面的区分
@protocol SecondViewDelegete <NSObject>//SecondViewDelegete是自定义的协议名
@optional
//协议中的方法,与FirstController的跳转方法to_second名字对应
-(void)re_first;
@end
@interface SecondView : UIView
//让子视图FirstView遵从协议
@property(nonatomic,weak)id <SecondViewDelegete>deledete1;
@end
2.SecondView.m文件,在头部添加这些让SecondView遵从协议(自己对比区别多了哪些)
#import "SecondView.h"
#import "SecondController.h";
@interface SecondView()<SecondViewDelegete>//<SecondViewDelegete>表示遵从SecondViewDelegete协议
@end
@implementation SecondView
//后面的代码我就不全部复制出来了,需要添加就这几行
3.SecondController.m文件,让父类SecondController遵从协议
#import "SecondController.h"
#import "SecondView.h"
#import "SecondController.h"
@interface SecondController ()<SecondViewDelegete>
@property(nonatomic,strong)SecondView *secondView;
@end
@implementation SecondController
//子类视图在父类中软初始化
- (SecondView *)secondView{
if(!_secondView){
_secondView = [SecondView new];
_secondView.deledete1 = self;//子类遵从协议
// _homeView.backgroundColor = [UIColor redColor];
}
return _secondView;
}
4.最后一步、回到FirstView.m文件,定义步骤第3步中的相应方法re_first1,re_first定义在协议self.deledete中。
-(void)re_first1{
if ([self.deledete respondsToSelector:@selector(re_first)]) {
[self.deledete re_first];
}
NSLog(@"返回成功");
}