iOS轉(zhuǎn)場(chǎng)及傳值

作為初學(xué)者, 有錯(cuò)誤的地方還請(qǐng)大神們挑出, 本人接受批評(píng), 多謝各位大神了

iOS轉(zhuǎn)場(chǎng): (RootViewController, SecondViewController)

<#(nonnull UIViewController *)#>: 目標(biāo)viewController

animated: 是否存在動(dòng)畫

//Show: 選擇Show,目的地視圖會(huì)被壓入導(dǎo)航棧頂部. 導(dǎo)航條會(huì)提供一個(gè)后退按鈕,用以返回源視圖. 這是最常用的方式.
//Show detail:與Show相似, 但會(huì)替換源視圖. 將沒有導(dǎo)航條和后退按鈕.
[self.navigationController pushViewController:delita animated:YES];
[self.navigationController showViewController:delita sender:<#(nullable id)#>

completion: 轉(zhuǎn)場(chǎng)之后做什么, 是一個(gè)block函數(shù)

//Present Modally: 模態(tài)顯示內(nèi)容.目的地視圖會(huì)從底向上彈出, 通常用于顯示跟頁面連貫性不強(qiáng)的視圖, 比如 添加餐館, 添加用戶(無論在哪個(gè)頁面,都可能會(huì)調(diào)用此功能)
self.navigationController presentViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#> completion:<#^(void)completion#>

Present as popover:iPad中常用,模態(tài)顯示一個(gè)帶箭頭指向圓角矩形彈窗. 類似一個(gè)彈出菜單.

轉(zhuǎn)場(chǎng)傳值:

1. 屬性傳值

//轉(zhuǎn)場(chǎng)方法
- (void)btnAction:(UIButton *)btn{
    SecondViewController *sec = [[SecondViewController alloc] init];//獲取目標(biāo)場(chǎng)景
    sec.string = self.label.text;//string為目標(biāo)場(chǎng)景中的屬性(NSString)
    [self.navigationController pushViewController:sec animated:YES];//轉(zhuǎn)場(chǎng)
}

2. 代理傳值(反向轉(zhuǎn)場(chǎng))

1. 設(shè)置代理

@protocol SecondViewControllerDelegate <NSObject>
@optional
- (void)changeTitle:(NSString *)title;
@end

2. 在SecondViewController.h定義代理

@property (nonatomic, assign) id<SecondViewControllerDelegate>delegate;

3. 在SecondViewController.m使用代理傳值

- (void)backAction:(UIButton *)btn{
    if (self.delegate && [self.delegate respondsToSelector:@selector(changeTitle:)]) {//判斷是必須的
        [self.delegate changeTitle:self.textField.text];
    }
    [self.navigationController popToRootViewControllerAnimated:YES];
}

4. 在RootViewController.m中遵循代理并且實(shí)現(xiàn)代理方法

記得讓SecondViewController指定代理人為RootViewController.m

- (void)changeTitle:(NSString *)title{
    self.navigationItem.title = title;
}

3. block 傳值

block定義

/**
     *    //定義一個(gè)參無返回值的block函數(shù)
     *    void 無返回值
     *
     *    @param ^ block名稱
     *
     *    @^() 無參數(shù)
     */
    void (^voidFunc)() = ^(){
        NSLog(@"我是一個(gè)代碼塊");
    };
    //使用block
    voidFunc();
/**
     *    定義一個(gè)實(shí)現(xiàn)輸出兩個(gè)整數(shù)之和的block函數(shù)
     *    void 無返回值
     *    @param (int , int )類型說明
     *    @param a 參數(shù)
     *    @param b 參數(shù)
     */
    void (^addBlock)(int , int ) = ^(int a, int b){
        NSLog(@"a + b = %d", a + b);
    };
    addBlock(4, 6);
/**
     *    block命別稱
     *
     *    @param void (^)(int , int) 函數(shù)類型
     *    @param Block 別名
     */
    typedef void (^Block)(int ,int );
    //給一個(gè)參數(shù)為兩個(gè)整數(shù), 返回值為整形的block類型命別稱
    typedef int (^addTwo)(int ,int );
    //block使用
    addTwo subBlock = ^(int a, int b){
        return a-b;
    };
    //block中沒有使用局部變量, block存儲(chǔ)在全局區(qū),
    //block中如果有使用全局變量, 則存儲(chǔ)在棧區(qū)
    subBlock(10, 5);

block傳值步驟

1. 在SecondViewController.h給block命別稱(一般不省略)
typedef void(^titleBlock)(NSString *title);
2. 在SecondViewController.h中定義一個(gè)block屬性
@property (nonatomic, copy) titleBlock myBlock;
//注意: block屬性必須用copy
//block使用全局變量, 存在棧區(qū), 使用copy是把block復(fù)制一份到堆區(qū)
3. 在跳轉(zhuǎn)頁面方法中給block屬性賦值(RootViewController的btnAction:)
    //在block中使用局部變量
    //__block(MRC)/__weak(ARC)
    __weak RootViewController *temp = self;//復(fù)制指針(引用計(jì)數(shù)不變)
    //不使用temp而用self, 在下個(gè)界面會(huì)持有self, 引用計(jì)數(shù)會(huì)+1
    //使用self容易造成循環(huán)引用(MRC下)
    sec.myBlock = ^(NSString *title){
        temp.navigationItem.title = title;
    };
4. 調(diào)用block屬性傳入?yún)?shù)
- (void)backAction:(UIButton *)btn{
    self.myBlock(self.textField.text);
    [self.navigationController popToRootViewControllerAnimated:YES];
}

單例模式傳值

1. 新建一個(gè)單例模式, 這里新建一個(gè)類白包含單例模式(User)

//在User.h中定義一些屬性, 這些屬性作為存取值的對(duì)象
@property (nonatomic, strong) NSString *userName;
@property (nonatomic, strong) NSString *passworld;
//設(shè)計(jì)一個(gè)單例模式初始化
//獲取唯一的用戶
+ (User *)defaultUser;

2. 實(shí)例化初始化

+ (User *)defaultUser{
    //static修飾的對(duì)象只會(huì)在第一次調(diào)用函數(shù)時(shí)初始化, 之后不再初始化
    static User *user = nil;
   if(user == nil){//判斷user是否為空, 空則初始化
       user =[ [User alloc] init];
   }
   return user;
}

2. 在RootViewController.m中導(dǎo)入U(xiǎn)ser.h, 同時(shí)在viewWillAppear(界面即將顯示)中獲取單例模式的值

- (void)viewWillAppear:(BOOL)animated{
    self.textField.text = [User defaultString].string;
}

3. 在轉(zhuǎn)場(chǎng)按鈕函數(shù)中將值存入U(xiǎn)ser中

- (void)btnAction:(UIButton *)btn{
    SecondViewController *sec = [[SecondViewController alloc] init];
    //獲取單例
    User *u = [User defaultString];
    //賦值
    u.string = self.textField.text;
    [self.navigationController pushViewController:sec animated:YES];
}
注: 如果需要讓RootViewController一開始就顯示, 比如讓textField一開始就顯示"單例模式"
//在viewDidLoad中直接初始化User并存值
self.textField.text = @"單例模式";
[User defaultString].string = self.textField.text;

4. 在SecondViewController中使用User中的string給self.textField.text賦值

self.textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 200, 200, 50)];
    self.textField.borderStyle = UITextBorderStyleRoundedRect;
    self.textField.text = [User defaultString].string;
    self.textField.delegate = self;
    self.textField.textAlignment = NSTextAlignmentCenter;
    self.textField.clearButtonMode = UITextFieldViewModeAlways;
    [self.view addSubview:self.textField];

5. 在按鈕返回函數(shù)中存儲(chǔ)數(shù)據(jù)

- (void)btnAction:(UIButton *)btn{
    User *u = [User defaultString];
    u.string = self.textField.text;
    [self.navigationController popViewControllerAnimated:YES];//返回上層界面
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卫旱,一起剝皮案震驚了整個(gè)濱河市棒假,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖内舟,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)燎窘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹄咖,“玉大人褐健,你說我怎么就攤上這事±教溃” “怎么了蚜迅?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俊抵。 經(jīng)常有香客問我谁不,道長,這世上最難降的妖魔是什么徽诲? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任刹帕,我火速辦了婚禮,結(jié)果婚禮上谎替,老公的妹妹穿的比我還像新娘偷溺。我一直安慰自己,他們只是感情好钱贯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布挫掏。 她就那樣靜靜地躺著,像睡著了一般秩命。 火紅的嫁衣襯著肌膚如雪尉共。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天硫麻,我揣著相機(jī)與錄音爸邢,去河邊找鬼樊卓。 笑死拿愧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碌尔。 我是一名探鬼主播浇辜,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼唾戚!你這毒婦竟也來了柳洋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤叹坦,失蹤者是張志新(化名)和其女友劉穎熊镣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绪囱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年测蹲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鬼吵。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扣甲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出齿椅,到底是詐尸還是另有隱情琉挖,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布涣脚,位于F島的核電站示辈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遣蚀。R本人自食惡果不足惜顽耳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妙同。 院中可真熱鬧射富,春花似錦、人聲如沸粥帚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芒涡。三九已至柴灯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間费尽,已是汗流浹背赠群。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旱幼,地道東北人查描。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像柏卤,于是被迫代替她去往敵國和親冬三。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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