1. 程式人生 > >控制器之間的資料傳遞——Block傳值

控制器之間的資料傳遞——Block傳值

Block傳值

我們先在這裡約定:介面1傳值到介面2為順傳,介面2傳值到介面1為逆傳

一般用Block傳值是為了降低檢視控制器之間的耦合度,和代理傳值類似主要用於逆序傳值。

一. 實現步驟

  1. 給介面2定義一個Block屬性;注意:在block傳值中,要傳幾個值,block就有幾個引數,引數要與傳的值對應

  2. 在介面2的跳轉方法中檢查block屬性是否有值,有值就執行block,然後介面2出棧

  3. 在介面1的跳轉方法中建立介面2,並把要執行的賦值語句儲存到介面2的block變數屬性

二. 具體程式碼

1. AppDelegate類

---------- AppDelegate.m
檔案 #import "AppDelegate.h" #include "OneViewController.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1. 建立視窗 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds
]; // 2. 建立視窗的根控制器 // 2.1 建立導航控制器的根控制器 UIViewController *oneVc = [[OneViewController alloc] init]; // 2.2 建立導航控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:oneVc]; // 2.3 給視窗設定根控制器 self.window.rootViewController = nav; // 3. 設定視窗為主視窗並顯示視窗 [self
.window makeKeyAndVisible]; // 隱藏導航控制器的導航條 nav.navigationBarHidden = YES; return YES; } @end

2. OneViewController類

---------- OneViewController.m檔案

#import "OneViewController.h"
#import "TwoViewController.h"

@interface OneViewController ()

@property (nonatomic,strong) UITextField *textField;

@end

@implementation OneViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  //設定控制器View的背景顏色
  self.view.backgroundColor = [UIColor greenColor];

  // 建立點選按鈕
  UIButton *clickBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  clickBtn.frame = CGRectMake(10, 100, 80, 40);
  clickBtn.backgroundColor = [UIColor whiteColor];
  [clickBtn setTitle:@"到介面2" forState:UIControlStateNormal];
  [clickBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  [clickBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
  [clickBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:clickBtn];

  // 建立文字框
  _textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 150, 250, 40)];
  _textField.borderStyle = UITextBorderStyleRoundedRect;
  _textField.backgroundColor = [UIColor whiteColor];
  [self.view addSubview:_textField];

}

#pragma mark - 點選事件

- (void)btnClick {

  // 建立介面2,並壓入棧
  TwoViewController *twoVc = [[TwoViewController alloc] init];
  [self.navigationController pushViewController:twoVc animated:YES];

  // 給介面的Block設定傳值程式碼塊
  twoVc.twoBlock = ^(NSString *str){
    // 用介面2的值賦給介面1的文字框,這句程式碼是在介面1中執行的
    _textField.text = str;
  };

}

@end

3. TwoViewController類

---------- TwoViewController.h檔案

#import <UIKit/UIKit.h>

// 自定義一個Block變數型別名
typedef void(^TwoViewControllerBlock)(NSString *);

@interface TwoViewController : UIViewController

// Block屬性
@property (nonatomic,strong) TwoViewControllerBlock twoBlock;

@end

---------- TwoViewController.h檔案

#import "TwoViewController.h"

@interface TwoViewController ()

@property (nonatomic,strong) UITextField *textField;

@end

@implementation TwoViewController

- (void)viewDidLoad {
    [super viewDidLoad];

  //設定控制器View的背景顏色
  self.view.backgroundColor = [UIColor yellowColor];

  // 建立點選按鈕
  UIButton *clickBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  clickBtn.frame = CGRectMake(10, 100, 80, 40);
  clickBtn.backgroundColor = [UIColor whiteColor];
  [clickBtn setTitle:@"傳 值" forState:UIControlStateNormal];
  [clickBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  [clickBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
  [clickBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:clickBtn];

  // 建立文字框
  _textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 150, 250, 40)];
  _textField.borderStyle = UITextBorderStyleRoundedRect;
  _textField.backgroundColor = [UIColor whiteColor];
  [self.view addSubview:_textField];
}

#pragma mark - 點選事件

- (void)btnClick {

  // 如果Block有值就執行Block
  if (_twoBlock) {
    // 傳入文字框的值傳到介面1
    _twoBlock(_textField.text);
  }

  // 跳轉介面
  [self.navigationController popViewControllerAnimated:YES];

}

@end

相關推薦

控制器之間資料傳遞——Block

Block傳值 我們先在這裡約定:介面1傳值到介面2為順傳,介面2傳值到介面1為逆傳 一般用Block傳值是為了降低檢視控制器之間的耦合度,和代理傳值類似主要用於逆序傳值。 一. 實現步驟

控制器之間資料傳遞——屬性

屬性傳值 我們先在這裡約定:介面1傳值到介面2為順傳,介面2傳值到介面1為逆傳 一. 順傳 介面2需要有一個用於接收資料的屬性 介面2在壓入棧之前,把介面1中的資料直接賦值給介面2的屬性 介面2

Android筆記--簡單的Fragment和Activity的之間資料互動(

通過點選MainActivity裡的按鈕傳一個字串給MainActivity2的fragment裡的textview,並顯示出來。 1、在MainActivity下:通過intent先把字串傳給Mai

iOS Block、代理、通知中心

  Joker_King  關注 2016.04.18 22:17*  字數 802  閱讀 1792 評論 7 喜歡 12 在我們需

關於兩個活動之間的本地廣播問題

  回味一下最近深受其擾的問題:手頭有兩個活動,監聽第一個活動中的sendMessage,呼叫第二個活動的方法並得到一個值,這時,希望在不啟動第二個活動的同時於第一個活動中體現這個值。感謝論壇上為我指明方向的大佬們,決定用本地廣播實現這個需求,實現過程及思路如下:   首先,

關於java的引數傳遞傳遞、引用傳遞引用等)

所謂引數傳遞就是用函式呼叫所給出的實參(實際引數)向函式定義所給出的形參(形式引數)設定初始值的過程。基本的有三種引數分別為: (1)傳值:   (2)傳址(即是傳指標) (3)傳引用 以上

Activity之間的三種方式

*************************************** 第一種:Extras:額外的,附加的.在Intent中附加額外的訊息 //傳值 Intent intent = new Intent(this, XXXActivity.class); intent.pu

淺析 iOS 開發頁面之間資料傳遞的方式

iOS 開發中 VC 之間資料的傳遞和交換可以有很多種方法,下面介紹常見的幾種方式,並且從設計和架構的層次上分析一下不同方法的優缺點和適用場景。內容主要來自於筆者自己在開發中的實踐和思考,如果有錯誤或者遺漏,歡迎聯絡指正。 為了方便描述,我們舉一個實際的用例。假

React 父子元件之間資料傳遞

一、父元件向子元件傳值 父元件通過屬性的方式向子元件傳值,子元件通過函式回撥的方式向父元件傳值。 案例一: 父元件: <PageTitle title="測試頁面標題" /> 子元件: <div>{this.props.title}&l

block

//主頁面 import UIKit class TableVC: UITableViewController { var sectionName:[String] = [] var rowName1:[String] = [] var rowName

android Activity之間資料傳遞 Parcelable和Serializable介面的使用

Activity之間傳資料時,為了避免麻煩,往往會將一些值封裝成物件,然後將整個物件傳遞過去。傳物件的時候有兩種情況,一種是實現Parcelable介面,一種是實現Serializable介面。 0、解釋兩種介面: 1)實現Serializable介面是JavaSE本身就支

兩個頁面之間通過js進行

第一個頁面中有兩個圖片,當點選的時候能在第二個頁面中獲得它的屬性值()通過js進行傳值: 第一個頁面: [html]  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xht

dm81xx link記憶體分配及link之間資料傳遞

======================================== 轉載:http://www.aiuxian.com/article/p-2695138.html ======================================

應用系統之間資料傳遞的幾種方式

隨著近年來SOA(面向服務技術架構)的興起,越來越多的應用系統開始進行分散式的設計和部署。 系統由原來單一的技術架構變成面向服務的多系統架構。 原來在一個系統之間可以完成的業務流程,通過多系統的之間多次互動來實現。 這裡不打算介紹如何進行S

關於Java物件作為引數傳遞還是引用的問題

前言   在Java中,當物件作為引數傳遞時,究竟傳遞的是物件的值,還是物件的引用,這是一個飽受爭議的話題。若傳的是值,那麼函式接收的只是實參的一個副本,函式對形參的操作並不會對實參產生影響;若傳的是引用,那麼此時對形參的操作則會影響到實參。   首先我們來

Angular2父子元件之間資料傳遞:@Input和@Output (上)

為了讓大家學習起來輕鬆、易懂,小編儘量做到篇幅短,語言通俗易懂,知識點分段來講,以免太長了看起來很累,也很容易失去耐心閱讀下去,希望大家理解和支援,同時希望大家點贊和分享出去,讓更多的志同道合的朋友來學習 Angular 提供了@Input和@Output語法來處理元

ios block 最簡單的方法

1、在您需要傳值出去的控制器標頭檔案裡宣告: @property (nonatomic,copy) void(^stringblockr)(int age); 2、然後在你pop或者push到被傳值的頁面的方法裡,呼叫該方法: self.stringblockr(

Android元件之間 資料傳遞資料

自:http://blog.csdn.net/buaaroid/article/details/49665455  1  基於訊息的通訊機制 Intent--------bundle,extra 用這種簡單的形式,一般而言傳遞一些簡單的型別是比較容易的,如int、st

iOS block(逆

block是個好東西,是蘋果官方推薦的一種方法,效率高,程式碼簡單,今天用block主要是做一個簡單傳,暫時不對block詳細介紹,關於__block的用法,後期會一一介紹; 接下來,通過一個block,將 SecondViewController 的數值傳給  First

block的高階用法(一) -- block

我們先從簡單的入手,先講下block的傳值,後面會有更精彩的。 在講傳值之前我們先複習下block的基礎知識: - (void)viewDidLoad { [super viewDidLoa