中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS如何實現block傳值

發布時間:2021-08-13 18:11:03 來源:億速云 閱讀:156 作者:小新 欄目:移動開發

小編給大家分享一下iOS如何實現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 ><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 
{ 
//  點擊按鈕 返回上一個頁面 同時通過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]; 
}

以上是“iOS如何實現block傳值”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高清| 蓝田县| 军事| 方城县| 日照市| 张家港市| 广灵县| 金山区| 隆化县| 定兴县| 神木县| 黄浦区| 电白县| 化德县| 綦江县| 唐海县| 罗山县| 武威市| 兴安盟| 安泽县| 湘潭县| 隆回县| 廉江市| 四川省| 惠来县| 儋州市| 团风县| 鹤峰县| 怀宁县| 门头沟区| 新巴尔虎左旗| 万年县| 河间市| 娱乐| 卫辉市| 集贤县| 光山县| 海城市| 南皮县| 铅山县| 临夏市|