关闭

02-单例-通知-KVO-Block-代理

标签: IOS开发UI高级传值
227人阅读 评论(0) 收藏 举报
分类:
一、单例:

1.定义单例类
@interface single : NSObject
@property (nonatomic, copy) NSString *name;
+ (id)shareInstance;
@end

#import "single.h"
static single *instance = nil;
@implementation single

+ (
id)shareInstance
{
   
if (instance == nil) {
       
       
instance = [[single alloc] init];
       
    }
   
return instance;
}

@end

2.实现传值
传值者:
 single *s = [single shareInstance];
    s.name = _lable.text;

接收者:

//视图将要显示时调用
- (void)viewWillAppear:(BOOL)animated
{
   
single *s1 = [single shareInstance];
   
lable.text = s1.name;
}






二、通知:

1.发送通知
 //取得输入的数据
    NSString *text = _textFiekd.text;
    NSDictionary *dic = @{
                         
@"key":text
                          };
    //发送通知1
  [[NSNotificationCenter defaultCenter] postNotificationName:@"changeValue" object:self userInfo:dic];
  [self dismissViewControllerAnimated:YES completion:nil];

//发送通知2
[[NSNotificationCenter defaultCenter] postNotificationName:@"tapAction" object:self];

2.接受通知
//接收通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeAction:) name:@"changeValue" object:nil];
 
- (void)changeAction:(NSNotification *)notification {
    //取得传递的数据
   
NSDictionary *dic = notification.userInfo;
    _label.text = dic[@"key"];
}

//接受通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tapAction) name:@"tapAction" object:nil];

- (void)tapAction
{
    _isHidden = !_isHidden;
    self.navigationController.navigationBar.hidden = _isHidden;
    [[UIApplication sharedApplication] setStatusBarHidden:_isHidden];
}

//删除通知
- (void)dealloc
{
    [[
NSNotificationCenter defaultCenter] removeObserver:self];
}







三、KVO观察者模式
1.观察者
接收值
 _secondCtrl = [[SecondViewController alloc] init];
  
//监听secondCtrl的属性值变化
[_secondCtrl addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
  

//接收到消息后触发的方法
- (
void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(
id)object
                        change:(
NSDictionary *)change
                       context:(
void *)context {

   
NSLog(@"change:%@",change);
   
   
NSString *text = [change objectForKey:@"new"];
   
_label.text = text;
   
}
删除观察者
- (void)dealloc
{
    [_secondCtrl removeObserver:self forKeyPath:@"happyValue" context:NULL];
}



2.被观察者

定义观察属性
@property(nonatomic, copy)NSString *text;

赋值
self.text = _textFiekd.text;






四、Block
1.要传值的一边定义block

typedef  void(^MyBlock)(NSString *text);


@property(nonatomic, copy)MyBlock block;
@property (weak, nonatomic) IBOutlet UITextField *textFiekd;

if(_block != nil){
    _block(_textFiekd.text);
}

2.接收值的一边

- (void)viewWillAppear:(BOOL)animated {

    [
super viewWillAppear:animated];
   
    secondCtrl.block = ^(NSString *text) {
   
        _label.text = text;
    };
}
五、代理

要传值的一边如下配置:
@protocol sendData <NSObject>

- (
void)sendData:(NSString *)text;

@end

@property(nonatomic, assign)id<sendData> delegate;
@property (weak, nonatomic) IBOutlet UITextField *textFiekd;

- (
IBAction)dismissAction:(id)sender {
  
   if (self.delegate respondsToSelector:@selector(sendData:)) {
          [_delegate sendData:_textFiekd.text];
    }
    [
self dismissViewControllerAnimated:YES completion:nil];
}

接收值的一边如下配置:

@interface ViewController ()<sendData>
@property (weak, nonatomic) IBOutlet UILabel *label;


- (IBAction)presentAction:(id)sender {
   
SecondViewController *secondCtrl = [[SecondViewController alloc] init];
   
    secondCtrl.delegate =
self;
   
    [
self presentViewController:secondCtrl animated:YES completion:nil];

}

- (
void)sendData:(NSString *)text {

   
_label.text = text;
   
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:109766次
    • 积分:3588
    • 等级:
    • 排名:第9170名
    • 原创:218篇
    • 转载:65篇
    • 译文:0篇
    • 评论:5条
    最新评论