小編給大家分享一下iOS如何實(shí)現(xiàn)block傳值,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元酉陽土家族苗族做網(wǎng)站,已為上家服務(wù),為酉陽土家族苗族各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
首先我總結(jié)了一下block的公式:
步驟1.block 的聲明 返回值類型(^block 的名字)(參數(shù)列表);
步驟2.block 實(shí)現(xiàn) block的名字 = ^(參數(shù)列表)(){};
步驟3.block 的調(diào)用 block的名字();
下面是一個(gè)簡(jiǎn)單的block
// 聲明 void(^blockName)(int num,NSString *string); // 實(shí)現(xiàn) blockName = ^(int num,NSString *string) { NSLog(@"%d,%@",num,string); }; // 調(diào)用 blockName(520,@"phyone_"); }
由該例可以看出block的代碼執(zhí)行順序和其他的代碼執(zhí)行順序不一樣 它是先執(zhí)行聲明代碼 然后執(zhí)行調(diào)用代碼 最后才執(zhí)行實(shí)現(xiàn)代碼 由此我們利用block的回調(diào)性質(zhì) 達(dá)到我們傳值效果 當(dāng)然這只是在一個(gè)頁(yè)面的一段代碼 只是說明了它具有傳值的作用 下面我們來試試 多頁(yè)面之間的block反向傳值 由于是反向傳值 所以我們創(chuàng)建兩個(gè)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 ><span >{</span></p> <p ><span > void(^imageNameBlock_1)(NSString *imageName);</span></p> <p ><span > void(^lableBlock)(NSString *tontentText);</span></p> <p ><span >}</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 { // 點(diǎn)擊按鈕 返回上一個(gè)頁(yè)面 同時(shí)通過block 把這個(gè)值傳到上一個(gè)頁(yè)面 self.block(sender.titleLabel.text); [self dismissViewControllerAnimated:nil completion:nil]; }
另外:block 還有兩個(gè)問題
1.怎么改變block里面的值
用上面的代碼 在ViewController.m viewDidLoad 里面 添加代碼
1.局部變量 定義一個(gè)圖片名字的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");
就會(huì)出現(xiàn) Use of undeclared identifier 'image' 錯(cuò)誤情況 原因是我們?cè)噲D改變block里面的值 解決辦法就是 添加 __block 修飾(解注釋
__block UIImage *image;) 就行了
2.block的循環(huán)引用
用上面的代碼 在ViewController.m viewDidLoad 里面 添加代碼
// 全局變量 // block循環(huán) 引用 解決 我們用弱引用 __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];
再添加兩個(gè)方法
- (void)loadData { imageNameBlock_1(@"17.jpg"); } - (void)viewWillAppear:(BOOL)animated { [self loadData]; }
以上是“iOS如何實(shí)現(xiàn)block傳值”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章名稱:iOS如何實(shí)現(xiàn)block傳值
文章起源:http://www.rwnh.cn/article48/psghhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、Google、建站公司、網(wǎng)站維護(hù)、定制開發(fā)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)