控制器之間的資料傳遞——Block傳值
Block傳值
我們先在這裡約定:介面1傳值到介面2為順傳,介面2傳值到介面1為逆傳
一般用Block傳值是為了降低檢視控制器之間的耦合度,和代理傳值類似主要用於逆序傳值。
一. 實現步驟
給介面2定義一個Block屬性;注意:在block傳值中,要傳幾個值,block就有幾個引數,引數要與傳的值對應
在介面2的跳轉方法中檢查block屬性是否有值,有值就執行block,然後介面2出棧
在介面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