宽容他人,放过自己。

使用代理方法实现跨页面执行方法

Posted on By anchoriteFili

调用appDelegate中方法的方法.zip

Controller到Appdelegate传值

/**
 去别的页面执行方法的方法:
 1. 创建代理,将要在别的页面执行的方法做成代理方法
 2. 在本controller中创建代理属性,并且在需要激活代理方法的方法里写入
     - (void)haha {
     if (_delegate) {
     [_delegate haha];
     }
     }
    从别的页面调用代理方法
 3. 在别的页面执行代理方法
 */

#warning 1.创建代理,可以通过代理去别的地方执行方法
@protocol ViewControllerDelegate <NSObject>
@required
- (void)haha; //到AppDelegate中执行该方法
@end

#pragma mark 创建代理属性
@property (nonatomic,assign) id<ViewControllerDelegate,NSObject> delegate;

[self haha]; //调用本页面方法

#pragma mark 通过代理去执行AppDelegate中的方法
- (void)haha {
    if (_delegate) {
        [_delegate haha];
    }
}

#import "ViewController.h"
#warning 在此页面引用ViewController.h,执行ViewControllerDelegate代理方法,
@interface AppDelegate : UIResponder <UIApplicationDelegate,ViewControllerDelegate> {
    ViewController *VC;
}

#pragma mark 调用VC,添加VC,执行代理方法,实现跨页面执行方法
    VC = [[ViewController alloc] init];
    self.window.rootViewController = VC;
    VC.delegate = self;

#pragma mark 执行代理方法
- (void)haha {
    NSLog(@"haha");
}

View使用代理调用controller中方法

#pragma mark 创建代理方法
@protocol ViewDelegate <NSObject>
- (void)viewDelegate;
@end

@property (nonatomic,assign) id<ViewDelegate,NSObject> viewDelegateOne; //创建代理

- (instancetype)initWithFrame:(CGRect)frame andDelegate:(id) delegate; //重写创建方法

#pragma mark 在方法中直接对代理进行赋值,如果不在此赋值,则会先执行方法在对代理赋值,出错
- (instancetype)initWithFrame:(CGRect)frame andDelegate:(id) delegate {
    _viewDelegateOne = delegate;
    return [self initWithFrame:frame];
}

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
        view.backgroundColor = [UIColor redColor];
        [self addSubview:view];
        
        
        
        
        [self viewDelegate]; //这个页面调用方法
    }
    return self;
}

#pragma mark 调用controller中方法
- (void)viewDelegate {
    if (_viewDelegateOne) {
        [_viewDelegateOne viewDelegate];
    }
}

#import "View.h" //引入

@interface ViewController : UIViewController<ViewDelegate> {
    View *testView;
}

testView = [[View alloc] initWithFrame:CGRectMake(100, 100, 200, 200) andDelegate:self];

    [self.view addSubview:testView];

#pragma mark 执行View中的方法
- (void)viewDelegate {
    NSLog(@"view测试成功");
}