iOSiOS学习iOS开发

ios中的协议——protocol

2017-06-21  本文已影响2240人  快乐的tomato

思考:在一个类中,能否让一个类必须实现某种方法?

一、 非正式协议

非正式协议就是类别,即凡是NSObject或其子类的类别,都是非正式协议。

二、协议(protocol)

2.1、 what
一些方法的声明,写到.h文件中。
方法有2种,一是必须实现,二是选择实现。
2.2 、协议的作用
供其他的类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法。
2.3、如何定义一个协议

@protocol XXX <NSObject>

@end 

2.4 如何遵守协议

@interface 类名:NSobject<XXX1>

@end

2.4、使用注意

三、代理模式

3.1 what
传入的对象,代替当前类完成了某个功能,成为代理模式
3.2 思路

代码实例,逆向传值
XieYiOneViewController

#import <UIKit/UIKit.h>

@interface XieYiOneViewController : UIViewController

@end
#import "XieYiOneViewController.h"
#import "XieYiTwoViewController.h"

@interface XieYiOneViewController ()<XieYiTwoDelegate>

@property (weak, nonatomic) IBOutlet UITextField *telePhoneField;

- (IBAction)btnClick:(id)sender;

@end

@implementation XieYiOneViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)btnClick:(id)sender {
    
   XieYiTwoViewController *nextVC = [[XieYiTwoViewController alloc] init];
    
    nextVC.delegate = self;
    
   [self.navigationController pushViewController:nextVC animated:YES];
    
    
}
//协议传值(逆传)
#pragma mark -XieYiTwoDelegate
-(void)ChangeViewController:(XieYiTwoViewController *)viewController changeText:(NSString *)text
{
    self.telePhoneField.text = text;
}
@end

XieYiTwoViewController

#import <UIKit/UIKit.h>
@class XieYiTwoViewController;
@protocol XieYiTwoDelegate <NSObject>
- (void)ChangeViewController:(XieYiTwoViewController *)viewController  changeText:(NSString *)text;

@end

@interface XieYiTwoViewController : UIViewController

@property (nonatomic,assign) id <XieYiTwoDelegate> delegate;

@end
#import "XieYiTwoViewController.h"

@interface XieYiTwoViewController ()

@property (weak, nonatomic) IBOutlet UITextField *telePhonefield;


- (IBAction)btnClick:(id)sender;

@end

@implementation XieYiTwoViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

//协议传值
- (IBAction)btnClick:(id)sender {
    
    if ([self.delegate respondsToSelector:@selector(ChangeViewController:changeText:)]) {
        
        [self.delegate ChangeViewController:self changeText:self.telePhonefield.text];
    
    }
    
    [self.navigationController popViewControllerAnimated:YES];
}
@end

疑问:

代码.png 关系图.png

由图可知,UISwitch用strong和weak修饰都没有影响,但是官方建议用weak。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    UIScrollView *sl = [[UIScrollView alloc] init];
    sl.delegate = self;
    [self.view addSubview:sl];
}
关系图.png
上一篇下一篇

猜你喜欢

热点阅读