iOS開(kāi)發(fā)關(guān)于Delegate的案例分析
推薦 + 挑錯(cuò) + 收藏(0) + 用戶(hù)評(píng)論(0)
有兩個(gè)scene,分別為Scene A和Scene B。Scene A上有一個(gè)UIButton(Button A)和一個(gè)UILable(Lable A);Scene B上有一個(gè)UITextFiled(textFiled)。當(dāng)單擊Scene A上的Button A時(shí),跳轉(zhuǎn)到Scene B,在Scene B的textFiled上輸入文字,單擊鍵盤(pán)的“完成”按鈕,返回到Scene A,并在Scene A的Lable A上顯示剛才輸入的內(nèi)容。
這是一個(gè)典型的場(chǎng)景之間的跳轉(zhuǎn)和逆向傳值問(wèn)題,看似簡(jiǎn)單,卻暗藏殺機(jī)。我們不僅要使用Storyboard框架,還要采用Delegate模式,最后達(dá)到題目要求。
Delegate
什么是Delegate?跟這道題目又有什么關(guān)系呢?
簡(jiǎn)單分析一下題目,主要包括Storyboard的應(yīng)用,頁(yè)面跳轉(zhuǎn),數(shù)據(jù)的交互,似乎跟Delegate沒(méi)什么關(guān)系呢。在這里我決定先不刨根問(wèn)底,留一個(gè)小懸念,在實(shí)際的解決問(wèn)題的過(guò)程中去慢慢“悟”關(guān)于Delegate的一切,它是一種設(shè)計(jì)模式,并不是那么簡(jiǎn)單就能描述清楚的。
頁(yè)面之間的數(shù)據(jù)傳遞
iOS提供了多種方法,來(lái)實(shí)現(xiàn)頁(yè)面之間的數(shù)據(jù)傳遞:
使用SharedApplication,定義一個(gè)類(lèi)似全局的變量來(lái)傳遞
使用文件,或者使用NSUserdefault來(lái)傳遞
通過(guò)一個(gè)單例(SingleXX)的class來(lái)傳遞
通過(guò)Delegate來(lái)傳遞
關(guān)于數(shù)據(jù)的存儲(chǔ)方式共有五種:
User Defaults
Property List(對(duì)應(yīng))
Object archives
SQLite
Core Data
在本道題目當(dāng)中,顯然采用Delegate方式是最佳方案。
界面搭建
有了先前我們使用Storyboard的經(jīng)驗(yàn),我們先很快的對(duì)界面進(jìn)行搭建。先拋開(kāi)所有的segue不管,先把題目中描述的情況展現(xiàn)出來(lái)再說(shuō)。
我們新建名為delegateSentValue的工程,在原有viewController的基礎(chǔ)上再新建一個(gè),同時(shí)新建名為viewController2的.h和.m文件,對(duì)它們進(jìn)行關(guān)聯(lián)。再向兩個(gè)view中拖放組件,并且將它們關(guān)聯(lián)到相應(yīng)的文件。這個(gè)過(guò)程應(yīng)該是很簡(jiǎn)單的,我們暫且不管需要響應(yīng)事件的Button,只是將兩個(gè)Lable和一個(gè)textFiled在兩個(gè).h文件中進(jìn)行屬性聲明。完成后如下圖:
?
搭建完成界面之后,我們先實(shí)現(xiàn)從Scene A到Scene B的跳轉(zhuǎn)。通過(guò)“Ctrl+drag”操作,將Button與Scene B關(guān)聯(lián),設(shè)置為“modal”模式,然后我們選中這個(gè)Segue,將它的identifier命名為Segue_ID_AB。
我們可以先來(lái)運(yùn)行下,這時(shí)我們可以實(shí)現(xiàn)通過(guò)點(diǎn)擊按鈕實(shí)現(xiàn)頁(yè)面正向跳轉(zhuǎn)的功能,點(diǎn)擊輸入框,我們可以接受鍵盤(pán)的輸入。
Delegate應(yīng)用
我們所剩的任務(wù)還有輸入內(nèi)容,單擊鍵盤(pán)上的“完成(return)”按鈕,返回Scene A,并將剛才輸入的內(nèi)容顯示在Scene A中。
對(duì)于一個(gè)Delegate應(yīng)用,需要5步來(lái)完成:
委托者聲明一個(gè)Delegate
委托者調(diào)用Delegate內(nèi)的方法
關(guān)聯(lián)委托者與被委托者
被委托者遵循Delegate協(xié)議
被委托者重寫(xiě)Delegate內(nèi)的方法
委托者聲明一個(gè)Delegate
在ViewController2中,#import下,@interface前添加如下代碼:
@protocol ViewController2Delegate -(void) viewController2:(ViewController2 * )sceneBVC didInputed:(NSString * )string;
@end
在@interface中聲明:
@property (weak, nonatomic) id delegate;
通過(guò)@protocol創(chuàng)建一個(gè)Delegate并聲明。
這里需要注意的一點(diǎn)是,如果僅僅是按照上面的要求去添加代碼,會(huì)出現(xiàn)“Expected a type.”的錯(cuò)誤,原因是我們要使用ViewController2類(lèi)型,而這個(gè)類(lèi)型先前是沒(méi)有定義過(guò)的,可是如果我們把@protocol,也就是上面三行代碼移到@property下面去的時(shí)候呢,在聲明中的ViewController2Delegate又出現(xiàn)了同樣的問(wèn)題。于是乎,我們需要修改一下代碼的結(jié)構(gòu),我們首先創(chuàng)建Delegate,然后聲明,最后再在@interface的后面定義Delegate內(nèi)的方法,這樣一來(lái)就沒(méi)有問(wèn)題了。最后完整的ViewController2.h的代碼如下:
#import @protocol ViewController2Delegate;
@interface ViewController2 : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *showInformation2;
@property (weak, nonatomic) IBOutlet UITextField *inputInformation;
@property (weak, nonatomic) id delegate;
@end
@protocol ViewController2Delegate -(void) viewController:(ViewController2 *) sceneBVC didInputed:(NSString *) string;
@end
委托者調(diào)用Delegate內(nèi)的方法
解決了上面的問(wèn)題后,這一步就比較簡(jiǎn)單了,添加代碼即可:
-(BOOL)textFieldShouldReturn:(UITextField *) textField{
if (self.delegate) {
//將UITextField內(nèi)容傳遞給Delegate內(nèi)的方法
?。踫elf.delegate viewController:self didInputed:self.inputInformation.text];
//讓當(dāng)前呈現(xiàn)的Scene B頁(yè)面消失
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
//讓鍵盤(pán)消失
?。踭extField resignFirstResponder];
return YES;
}
僅僅添加代碼是遠(yuǎn)遠(yuǎn)不夠的,我們還要關(guān)聯(lián),具體做法是在Storyboard中,選中ViewController2中的TextFiled控件,采用“Ctrl+drag”操作將其與ViewController2關(guān)聯(lián)。
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
iOS開(kāi)發(fā)關(guān)于Delegate的案例分析下載
相關(guān)電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復(fù)哪些問(wèn)題? 380
- 華為全新鴻蒙蓄勢(shì)待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應(yīng)用 719
- 蘋(píng)果手機(jī)系統(tǒng)iOS 17遭用戶(hù)質(zhì)疑 731
- iPhone12輻射超標(biāo)?蘋(píng)果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標(biāo)明年智能手機(jī)出貨7000萬(wàn)部;消息稱(chēng) MiOS 僅限國(guó)內(nèi),小米 28208
- 蘋(píng)果推送iOS17.0.3,解決iPhone15Pro系列存在機(jī)身過(guò)熱 216
- Testin云測(cè)兼容和真機(jī)服務(wù)平臺(tái)中上線iPhone 15系列手機(jī) 208
- 利爾達(dá)推出搭載HooRiiOS的Matter模組 145
- 運(yùn)放參數(shù)解析:輸入偏置電流(Ibias)和失調(diào)電流(Ios) 128
- 昆侖太科發(fā)布支持國(guó)產(chǎn)飛騰騰銳D2000芯片的開(kāi)源BIOS固件版本 448