麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > iOS > 正文

iOS(閉包)block傳值詳解

2019-10-21 18:41:41
字體:
來源:轉載
供稿:網友

在iOSAPP開發的過程中 我們會用到很多需要傳值的地方 傳值的方式也多種多樣 有:代理傳值、通知傳值、KVC、KVO、block、單例 等。其中block 因為其簡潔實用規范的代碼 無疑是大牛們傳值的不二選擇 但對于初學者來說要理解并能運用 起初確實有些難以理解 以下我將細細的介紹下block

首先我總結了一下block的公式:

  1. 步驟1.block 的聲明 返回值類型(^block 的名字)(參數列表);
  2. 步驟2.block 實現 block的名字 = ^(參數列表)(){};
  3. 步驟3.block 的調用 block的名字();

下面是一個簡單的block

//  聲明   void(^blockName)(int num,NSString *string); //  實現   blockName = ^(int num,NSString *string)   {     NSLog(@"%d,%@",num,string);   }; //  調用   blockName(520,@"phyone_"); } 

由該例可以看出block的代碼執行順序和其他的代碼執行順序不一樣 它是先執行聲明代碼 然后執行調用代碼 最后才執行實現代碼 由此我們利用block的回調性質 達到我們傳值效果 當然這只是在一個頁面的一段代碼 只是說明了它具有傳值的作用 下面我們來試試 多頁面之間的block反向傳值 由于是反向傳值 所以我們創建兩個ViewController (ViewController,Next_ViewController)先由ViewController跳到Next_ViewController里將里面的值反向傳給ViewController
以下是代碼

ViewController.m里面

- (void)viewDidLoad {   [super viewDidLoad];   self.view.backgroundColor = [UIColor purpleColor];  UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 200, 100)];   lable.backgroundColor = [UIColor brownColor];   [self.view addSubview:lable];      UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];   [self.view addGestureRecognizer:tap]; } - (void)tap {   Next_ViewController *NVC = [[Next_ViewController alloc]init];   NVC.block = ^(NSString *content){     NSLog(@"%@",content);     UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(100, 200, 100, 100)];     [button setTitle:content forState:UIControlStateNormal];     button.backgroundColor = [UIColor orangeColor];     [self.view addSubview:button];   };   [self presentViewController:NVC animated:YES completion:nil]; } 

Next_ViewController.h里面

//block 是分配在棧里面的用copy @property(nonatomic,copy) void(^block)(NSString *content); 

Next_ViewController.m里面

<p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="font-size:12px;">{</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="font-size:12px;">  void(^imageNameBlock_1)(NSString *imageName);</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="font-size:12px;">  void(^lableBlock)(NSString *tontentText);</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"><span style="font-size:12px;">}</span></p> 
- (void)viewDidLoad {   [super viewDidLoad];   self.view.backgroundColor = [UIColor orangeColor];   UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];   button.frame = CGRectMake(100, 200, 100, 50);   [button setTitle:@"123456" forState:UIControlStateNormal];   button.backgroundColor = [UIColor redColor];   [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];   [self.view addSubview:button]; } - (void)buttonAction:(UIButton *)sender { //  點擊按鈕 返回上一個頁面 同時通過block 把這個值傳到上一個頁面   self.block(sender.titleLabel.text);   [self dismissViewControllerAnimated:nil completion:nil]; }

另外:block 還有兩個問題

1.怎么改變block里面的值

用上面的代碼 在ViewController.m viewDidLoad 里面 添加代碼

 1.局部變量  定義一個圖片名字的Block  */ //  局部變量      void(^imageNameBlock)(NSString *imageName); //  如果想修改Block里面的值 需添加__block修飾    //  __block UIImage *image;   imageNameBlock = ^(NSString *imageName)   {     image = [UIImage imageNamed:imageName];     self.view.backgroundColor = [UIColor colorWithPatternImage:image];   };   imageNameBlock(@"17.jpg"); 

就會出現 Use of undeclared identifier 'image' 錯誤情況 原因是我們試圖改變block里面的值 解決辦法就是 添加 __block 修飾(解注釋

__block UIImage *image;) 就行了

2.block的循環引用

用上面的代碼 在ViewController.m viewDidLoad 里面 添加代碼

//  全局變量 //  block循環 引用 解決 我們用弱引用 __block   __weak ViewController *VC = self;      __block UIImage *image = nil;   imageNameBlock_1 = ^(NSString *imageName)   {     image = [UIImage imageNamed:imageName];     VC.view.backgroundColor = [UIColor colorWithPatternImage:image];   };   UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 200, 100)];   lable.backgroundColor = [UIColor brownColor];   [self.view addSubview:lable];      UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];   [self.view addGestureRecognizer:tap]; 

再添加兩個方法

- (void)loadData {   imageNameBlock_1(@"17.jpg"); }  - (void)viewWillAppear:(BOOL)animated {   [self loadData]; } 

當出現循環引用是我們用__weak修飾下 但具體機制還不太懂 希望高人指點,感謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国内精品国产三级国产a久久 | 黄色大片在线免费看 | 毛片在线播放视频 | 看全色黄大色黄大片女图片 | 精品在线一区二区三区 | 欧美精品久久久久久久久久 | 国产69精品久久久久久 | 欧美视频国产精品 | 午色影院| v11av在线视频成人 | 久草视频国产在线 | 萌白酱福利视频在线网站 | 九九色在线观看 | 久久国产精品区 | 亚洲成人免费电影 | 亚洲射吧 | 久久精品亚洲国产奇米99 | 视频一区二区三区在线观看 | 欧美成人免费 | 色999国产 | 久久青草影院 | 久久久久久久一区 | 91午夜少妇三级全黄 | 久久国产精品成人免费网站 | 国产精品欧美久久久久一区二区 | 99精品国产一区二区三区 | 免费视频aaa | 黄色片免费在线播放 | 欧美精品一区二区三区久久久 | av国语| 精品国产一区二区三区四区阿崩 | 欧美黄色性生活视频 | 成人男女啪啪免费观看网站四虎 | 深夜视频在线 | 欧美特级一级毛片 | 欧美日本不卡 | 日本娇小videos高潮 | 国产精品久久久久久久久久10秀 | 国产精品久久久久久影视 | 日日狠狠久久 | 一级成人欧美一区在线观看 |