亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人写真视频福利网| 懂色av中文一区二区三区天美| 欧美日韩精品在线观看| 久久天天躁狠狠躁夜夜躁2014| 日韩av理论片| 亚洲成人三级在线| 色爱av美腿丝袜综合粉嫩av| 国产欧美婷婷中文| 日韩欧美在线中文字幕| 成人444kkkk在线观看| 亚洲成年人影院在线| 亚洲v日韩v综合v精品v| 国产精品国模在线| 久久久久久网址| 黑人精品xxx一区| 日本一区二三区好的精华液| 国产精品视频一区二区高潮| 91精品久久久久久久久久久| 91禁国产网站| 久久国产精品偷| 亚洲女性裸体视频| 在线a欧美视频| 日韩电影中文字幕在线观看| 国产区亚洲区欧美区| 日韩欧美在线播放| 日韩激情在线视频| 久久精品国产亚洲一区二区| 日韩高清中文字幕| 亚洲欧洲激情在线| 国产视频精品va久久久久久| 日本久久中文字幕| 97成人精品区在线播放| 日本伊人精品一区二区三区介绍| 亚洲免费人成在线视频观看| 久久久亚洲国产天美传媒修理工| 91在线视频一区| 日韩精品视频免费专区在线播放| 精品视频偷偷看在线观看| 国产精品美女久久久免费| 国产精品久久综合av爱欲tv| 不卡av在线播放| 日韩在线观看精品| 九九久久久久99精品| 亚洲大胆美女视频| 性色av一区二区三区在线观看| 插插插亚洲综合网| 精品国产31久久久久久| 亚洲专区中文字幕| 国产亚洲精品成人av久久ww| 正在播放欧美一区| 国产在线精品一区免费香蕉| 国产精品黄页免费高清在线观看| 成人国产精品一区二区| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲天堂免费视频| 国产午夜精品一区二区三区| 国产精品久久久久久久美男| 91sao在线观看国产| 日韩久久精品成人| 亚洲国产精品嫩草影院久久| 国产欧美日韩中文字幕在线| 欧美性猛交xxxx黑人| 欧美成人全部免费| 欧美黑人视频一区| 亚洲人成免费电影| 久久精品99久久久香蕉| 成人性教育视频在线观看| 亚洲欧美国产制服动漫| yw.139尤物在线精品视频| 亚洲欧美日韩国产中文专区| 国产精品久久久av久久久| 欧美一区三区三区高中清蜜桃| 久久视频免费观看| 91精品国产乱码久久久久久蜜臀| 国产精品欧美激情在线播放| 欧美精品18videosex性欧美| 亚洲自拍小视频免费观看| 久久免费精品视频| 国产日韩中文字幕| 亚洲色图av在线| 91在线网站视频| 欧美成人中文字幕在线| 国产精品爽爽ⅴa在线观看| www高清在线视频日韩欧美| 大胆欧美人体视频| 久久躁狠狠躁夜夜爽| 亚洲精品视频免费| 精品亚洲国产成av人片传媒| 91精品国产成人| 色偷偷噜噜噜亚洲男人| 久久精品人人爽| 精品调教chinesegay| 亚洲国产精品久久91精品| 怡红院精品视频| 久久精品在线视频| 久久躁狠狠躁夜夜爽| 国产精品黄色影片导航在线观看| 亚洲精品久久久一区二区三区| 国产999在线观看| 亚洲成人久久网| 国产成人精品免费久久久久| 91色琪琪电影亚洲精品久久| 亚洲一区二区黄| 992tv在线成人免费观看| 亚洲丝袜在线视频| 91精品视频一区| xxxx性欧美| 51精品在线观看| 日韩影视在线观看| 欧美日韩成人免费| 精品动漫一区二区三区| 91视频免费网站| 亚洲精品aⅴ中文字幕乱码| 国产亚洲欧洲高清一区| 精品久久久久久久久久国产| 中文字幕亚洲无线码在线一区| 色青青草原桃花久久综合| 久久天天躁夜夜躁狠狠躁2022| 色婷婷亚洲mv天堂mv在影片| 美日韩精品视频免费看| 精品久久久久久亚洲精品| 北条麻妃一区二区在线观看| 国产在线精品播放| 丝袜情趣国产精品| 国产精品视频大全| 日韩av在线资源| 欧美日韩亚洲天堂| 日韩欧美在线一区| 欧美激情亚洲综合一区| 成人免费福利在线| 清纯唯美日韩制服另类| 欧美精品制服第一页| 亚洲国产精品推荐| 久久精品国产精品| 国产精品观看在线亚洲人成网| 亚洲天堂一区二区三区| 国内伊人久久久久久网站视频| 欧美午夜视频在线观看| 亚洲成人精品视频| 一级做a爰片久久毛片美女图片| 在线视频亚洲欧美| 亚洲国产三级网| 国产精品扒开腿做爽爽爽的视频| 欧美日韩一区二区在线播放| 久久夜色撩人精品| 亚洲第一区第二区| 欧美尺度大的性做爰视频| 亚洲视频在线播放| 亚洲第一网站免费视频| 久久久久久久97| 日韩精品999| 欧美国产高跟鞋裸体秀xxxhd| 欧美高清激情视频| 欧美俄罗斯性视频| 久久69精品久久久久久国产越南| 成人福利免费观看| 一区二区亚洲欧洲国产日韩| 91精品综合视频| 成人激情电影一区二区| 亚洲国产91精品在线观看| 欧美野外猛男的大粗鳮| 日韩在线视频中文字幕| 亚洲女同精品视频| 国产成人小视频在线观看|