前言:
正常情况下,一个页面会有一个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(@"返回成功");
}