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

首頁 > 系統 > iOS > 正文

iOS(閉包)block傳值詳解

2020-07-26 02:29:56
字體:
來源:轉載
供稿:網友

在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修飾下 但具體機制還不太懂 希望高人指點,感謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区高清在线观看| 2019中文字幕在线免费观看| 亚洲一区二区三区视频播放| 日韩毛片在线观看| 久久在精品线影院精品国产| 青青草成人在线| 日韩欧美亚洲范冰冰与中字| 亚洲视频在线视频| 欧美日韩福利在线观看| 日本伊人精品一区二区三区介绍| www.欧美视频| 中文字幕日韩视频| 日本精品中文字幕| 欲色天天网综合久久| 国产区精品视频| 97超视频免费观看| 亚洲网在线观看| 国产精品扒开腿做爽爽爽视频| 成人黄色生活片| 在线观看日韩视频| 92国产精品视频| 国产精品爽黄69| 国产精品自产拍在线观| 日韩中文有码在线视频| 77777亚洲午夜久久多人| 97精品一区二区三区| 欧美日韩国产综合视频在线观看中文| 一区二区亚洲欧洲国产日韩| 国产成人综合一区二区三区| 国产成人在线视频| 国产欧美在线观看| 日韩www在线| 亚洲免费av网址| 亚洲欧洲成视频免费观看| 欧美性生交xxxxxdddd| 日韩高清a**址| 欧美激情喷水视频| 日本欧美一级片| 欧美激情videos| 欧美男插女视频| 亚洲精品久久久久久久久久久| 久久久亚洲福利精品午夜| 欧美激情视频在线免费观看 欧美视频免费一| 欧美激情18p| 在线一区二区日韩| 亚洲开心激情网| 91免费电影网站| 欧美专区在线观看| 国产一区二区三区三区在线观看| 最近日韩中文字幕中文| 亚洲欧洲高清在线| 国产99在线|中文| 国产一区二区日韩精品欧美精品| 日韩69视频在线观看| 亚洲的天堂在线中文字幕| 一区二区中文字幕| 亚洲人成电影网站色| 亚洲自拍小视频| 国产精品久久久久久久av电影| 国产脚交av在线一区二区| 国产精品视频久| 午夜精品一区二区三区在线| 欧美一级成年大片在线观看| 色小说视频一区| 国产精品高潮视频| 久久成人18免费网站| 国产精品久久久久aaaa九色| 日韩精品在线私人| 亚洲跨种族黑人xxx| 欧美性极品少妇精品网站| 欧美裸体xxxx极品少妇软件| 久久精品国产欧美亚洲人人爽| 成人精品视频在线| 欧美精品videosex性欧美| 国产成人黄色av| 成人免费看吃奶视频网站| 国产精品海角社区在线观看| 亚洲精品99久久久久中文字幕| 欧美午夜精品在线| 久久青草精品视频免费观看| 91国产视频在线| 秋霞成人午夜鲁丝一区二区三区| 亚洲视频一区二区三区| 日韩欧美中文在线| 成人a视频在线观看| 性欧美xxxx| 亚洲欧洲日产国码av系列天堂| 福利一区福利二区微拍刺激| 日韩大片免费观看视频播放| 日本一欧美一欧美一亚洲视频| 欧美一级片免费在线| 97视频在线观看亚洲| 国内精品模特av私拍在线观看| 亚洲新中文字幕| 色综合伊人色综合网| xvideos成人免费中文版| 精品久久久久久久久久久久久久| 欧美性极品xxxx娇小| 欧美不卡视频一区发布| 黑人巨大精品欧美一区二区一视频| 韩剧1988在线观看免费完整版| 亚洲欧美在线免费观看| 久久久久久久久国产精品| 欧美激情喷水视频| 成人动漫网站在线观看| 精品久久久久久亚洲国产300| 午夜精品一区二区三区视频免费看| 亚洲区一区二区| 久久精品人人爽| 日韩高清不卡av| 庆余年2免费日韩剧观看大牛| 国产精品欧美一区二区| 日韩在线中文字| 国产欧美在线视频| 亚洲第一精品夜夜躁人人爽| 欧美激情日韩图片| 欧美亚洲一级片| 久久综合伊人77777| 亚洲成人xxx| 国产精品白嫩美女在线观看| 国产一区二区美女视频| 91视频国产精品| 国内精品小视频| 日韩欧美在线视频观看| 97精品国产aⅴ7777| 精品国内自产拍在线观看| 韩国美女主播一区| 亚洲xxx视频| 午夜精品一区二区三区视频免费看| 欧美性极品xxxx做受| 亚洲国产精彩中文乱码av| 日本国产精品视频| 欧美性xxxxxxxxx| 精品国产31久久久久久| 欧美激情2020午夜免费观看| 一本色道久久88综合亚洲精品ⅰ| 日韩欧美在线字幕| 亚洲理论电影网| 成人在线激情视频| 亚洲男人天堂2024| 操人视频在线观看欧美| 欧美野外wwwxxx| 一区二区av在线| 92国产精品久久久久首页| 欧美丝袜一区二区三区| 日韩精品中文字| 久久视频精品在线| 91国语精品自产拍在线观看性色| 78色国产精品| 亚洲美女久久久| 亚洲成在人线av| 欧美亚洲日本黄色| www日韩欧美| 亚洲伊人一本大道中文字幕| 日韩av电影手机在线| 精品国产乱码久久久久久虫虫漫画| 亚洲一区美女视频在线观看免费| 美女扒开尿口让男人操亚洲视频网站| 精品视频在线播放免| 国产亚洲欧美另类中文| 欧美国产日韩视频| 久久国产精品久久久久久| 亚洲97在线观看| 中文字幕亚洲情99在线|