iOS 開發中的自我管理模式
使用這個控件的人只需要調用這個 configure 方法就可以配置入參和事件處理。但隨之而來的就是一些蛋疼的問題:
configure 的調用者是 superview,上面的例子中也就是一個 UITableViewCell,但 Cell 這層并不知道自己的 ViewController 是誰,于是乎還得向上一級傳遞這個點擊事件,直到能獲取到 NavigationController,然后 Push 一個用戶信息的頁面。
這個 Avatar View 在 App 的各個地方都可能粗線,而且行為一致,那就意味著事件處理的 block,要散落在各個頁面中,同時也帶來了很多“只是為向上一層級轉發事件”的 “Middle Man”
為解決這個問題,就需要給這個 View 放權,讓其自己 Handle 自己的事件,也就是 Self-Managed,為了不破壞 View 的純潔性,比較好的實踐是在 Category 中實現:
@interface?FDAvatarView?(FDAvatarViewSelfManager)
-?(void)selfManagedConfigureWithAvatarURL:(NSURL?*)URL?VIPInfo:(id)info?uid:(NSString?*)uid;
@end
實現時最好要調用 View 主類提供的 API:
@implementation FDAvatarView (FDAvatarViewSelfManager)
// 為后一個頁面的創建增加了個 UID 參數
- (void)selfManagedConfigureWithAvatarURL:(NSURL *)URL VIPInfo:(id)info UID:(NSString *)UID {
[self configureWithAvatarURL:URL VIPInfo:info tapped:^{
// 假設 App 結構是 Root -》 TabBar -》 Navigation -》 ViewController
UITabBarController *tabBarControler = (id)[UIApplication.sharedApplication.delegate.window.rootViewController;
UINavigationController *navigationController = tabBarControler.selectedViewController;
// 創建用戶信息 View Controller
FDUserProfileViewController *profileViewController = [FDUserProfileViewController viewControllerWithUID:UID];
[navigationController pushViewController:profileViewController animated:YES];
}];
}
@end
這里用到了類似 AOP 的思路,添加了對 App 層級的耦合,如果覺得這樣的耦合方式不妥的話,也可以封裝個全局方法去取到當前頂層的 Navigation Controller。
這樣,FDAvatarView 的調用者只需要配置入參,其余的它自己全能搞定了,即使 App 內很多處出現頭像,邏輯代碼也只有一份。
接下來再來個例子:
這個點贊的按鈕功能上有幾個職責:
顯示已有的點贊數
點擊按鈕后執行一個小動畫,點贊數 +1,同時發送網絡請求。
若已經點贊,點擊執行反向操作
若網絡請求發送失敗,則回退成點擊前的狀態
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
iOS 開發中的自我管理模式下載
相關電子資料下載
- iOS17.1可能明天發布,iOS17.1主要修復哪些問題? 380
- 華為全新鴻蒙蓄勢待發 僅支持鴻蒙內核和鴻蒙系統應用 719
- 蘋果手機系統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
- 昆侖太科發布支持國產飛騰騰銳D2000芯片的開源BIOS固件版本 448