iOS傳值方式

在iOS中也切,常見的傳值方式有以下幾種:
1.屬性傳值
2.單例傳值
3.通知傳值
4.代理傳值
5.Block
這些傳值方式,各有各自的優(yōu)勢,下面我們來具體看看這幾種傳值方式的實現(xiàn)方法:
1.屬性傳值
屬性傳值第一步就得確定傳值得類型,然后定義屬性
例子:點擊MainViewController 中的一個按鈕跳到SecondViewContrller界面并且傳一個值到 SecondViewContrller
代碼實現(xiàn):

#import <UIKit/UIKit.h>

@interface SecondViewController : SecondViewController

@property(nonatomic,retain)NSString *nameStr;

@end

在MainViewController中實現(xiàn)如下代碼

-(void) name

{

SecondViewController *second = [[SecondViewController alloc] init];

Second.nameStr = @”pegboggs”;

[Self.navigationController pushViewController:second animated:YES];
}

2.單例傳值
單例只會對某個類實例化一次/單例類线召,對單例這個類實例化一次有且僅有一個對象,單例初始化多矮,只能初始化一次缓淹,然后指向?qū)ο蠊颍鋵嵍际侵赶蛞粋€內(nèi)存地址,也就是同一塊內(nèi)存讯壶,所以都是一樣的/
那么料仗,只能有一個對象,就是實例化的那個
單例方法使用很簡單伏蚊,就是相當(dāng)于定義了整個工程使用的變量立轧,在整個工程中可以隨時調(diào)用,隨時更改躏吊,全局唯一氛改。主要實現(xiàn)代碼如下:
.h文件中

@interface Single : NSObject

+(Single*) sharedInstance;
 -(id)init;

@end

.m文件中

#import "Single.h"

static Single *instance = nil;

@implementation Single

+(Single*) sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        instance = [[Single alloc] init];
    });
    return instance;
}

-(id) init
{
    if (self = [super init]) {

    }
    return self;
}

-(id) copyWithZone:(NSZone*)zone
{
    return instance;
}
+(id) allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken,^{
        instance = [super allocWithZone:0];
    });
    return instance;
}

@end

3.通知傳值
NSNotificationCenter提供了一種更加解耦的方式。最典型的應(yīng)用就是任何對象對可以發(fā)送通知到中心比伏,同時任何對象可以監(jiān)聽中心的通知胜卤。
發(fā)送通知的代碼如下:

[[NSNotificationCenter defaultCenter] postNotificationName:@”myNotificationName” object:broadcasterObject]; 

注冊接收通知的代碼如下:

[[NSNotificationCenter defaultCenter] addObserver:listenerObject selector:@selector(receivingMethodOnListener:) name:@”myNotificationName” object:nil]; 

4.代理傳值
這種傳值主要用于A進(jìn)入B,然后B輸入值后傳回給A赁项,比較常見的就是用于修改個人信息葛躏,點擊進(jìn)入修改界面,修改完之后回到顯示界面悠菜,顯示修改后的結(jié)果(以前我都是用單例舰攒,雖然也可以實現(xiàn),但是明顯這種方法更加實用)李剖。
在第二個界面里實現(xiàn)協(xié)議芒率,并設(shè)置代理囤耳,第一個界面實現(xiàn)協(xié)議方法篙顺,并在跳轉(zhuǎn)的時候,設(shè)置代理為本身充择,在第二個界面德玫,修改數(shù)據(jù)的時候,執(zhí)行代理方法椎麦,實現(xiàn)數(shù)據(jù)傳遞
代碼例子:
第一個界面.h文件

#import <UIKit/UIKit.h>

#import "FirstViewController.h"

@interface ViewController : UIViewController<theValue>
@property (nonatomic,strong) UILabel *nameLab;
@property (nonatomic,strong) UILabel *ageLab;

@end

第一個界面.m中

#import "ViewController.h"
#import "FirstViewController.h"
@interface ViewController ()

@end

@implementation ViewController
@synthesize nameLab,ageLab;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 30)];
    [btn setTitle:@"跳轉(zhuǎn)" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btn)   forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    nameLab = [[UILabel alloc] initWithFrame:CGRectMake(10, 200, 100, 30)];
    nameLab.text = @"name";
    [self.view addSubview:nameLab];
    ageLab = [[UILabel alloc] initWithFrame:CGRectMake(10, 250, 100, 30)];
    ageLab.text = @"age";
    [self.view addSubview:ageLab];
}
-(void) btn
{
    FirstViewController *first = [[FirstViewController alloc] init];
    first.delegate = self;
    [self presentViewController:first animated:YES completion:nil];
}
//協(xié)議實現(xiàn)

-(void) passValue:(NSString *)value
{
    nameLab.text = value;
    ageLab.text = value;
}


第二個界面.h文件

#import <UIKit/UIKit.h>

@protocol theValue <NSObject>

-(void)passValue:(NSString*)value;
@end
@interface FirstViewController : UIViewController
@property (nonatomic,strong) UITextField *nameField;
@property (nonatomic,strong) UITextField *ageField;
@property (nonatomic,assign) NSObject<theValue> *delegate;
@end

第二個界面.m文件

#import "FirstViewController.h"

@interface FirstViewController ()<theValue>

@end

@implementation FirstViewController
@synthesize nameField,ageField;

- (void)viewDidLoad {

    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 400, 100, 30)];
    [btn setTitle:@"dismis" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btn) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    nameField = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 100, 30)];
    nameField.placeholder = @"name";
    [self.view addSubview:nameField];
    ageField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 100, 30)];
    ageField.placeholder = @"age";
    [self.view addSubview:ageField];
}

-(void) btn
{
    [self.delegate passValue:nameField.text];
    [self dismissViewControllerAnimated:YES completion:nil];
}

5.Block
首先在第二界面的.h文件里定義聲明block屬性

typedef void (^ReturnTextBlock)(NSString *showText);

@property (nonatomic, copy) ReturnTextBlock returnTextBlock;

-(void) returnText :(ReturnTextBlock)block;

第二個界面.m文件中

-(void) returnText:(ReturnTextBlock)block{
     self.returnTextBlock = block;
}

把傳進(jìn)來的Block語句塊保存到本類的實例變量returnTextBlock
最后在第一個視圖中宰僧,獲得第二個視圖的控制器,并且用第二個視圖控制器來調(diào)用定義的屬性

-(void) btn
{
    FirstViewController *first = [[FirstViewController alloc] init];
       [first returnText:^(NSString *showText) {
        nameLab.text = showText;
    }];
    [self presentViewController:first animated:YES completion:nil];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末观挎,一起剝皮案震驚了整個濱河市琴儿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘁捷,老刑警劉巖造成,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雄嚣,居然都是意外死亡晒屎,警方通過查閱死者的電腦和手機喘蟆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼓鲁,“玉大人蕴轨,你說我怎么就攤上這事『Э裕” “怎么了橙弱?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長燥狰。 經(jīng)常有香客問我膘螟,道長,這世上最難降的妖魔是什么碾局? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任荆残,我火速辦了婚禮,結(jié)果婚禮上净当,老公的妹妹穿的比我還像新娘内斯。我一直安慰自己,他們只是感情好像啼,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布俘闯。 她就那樣靜靜地躺著,像睡著了一般忽冻。 火紅的嫁衣襯著肌膚如雪真朗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天僧诚,我揣著相機與錄音遮婶,去河邊找鬼。 笑死湖笨,一個胖子當(dāng)著我的面吹牛旗扑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慈省,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼臀防,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了边败?” 一聲冷哼從身側(cè)響起袱衷,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笑窜,沒想到半個月后致燥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡怖侦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年篡悟,在試婚紗的時候發(fā)現(xiàn)自己被綠了谜叹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡搬葬,死狀恐怖荷腊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情急凰,我是刑警寧澤女仰,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抡锈,受9級特大地震影響疾忍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜床三,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一一罩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撇簿,春花似錦聂渊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至找蜜,卻和暖如春饼暑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洗做。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工弓叛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竭望。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓邪码,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咬清。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容