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