根據項目需求,有時我們創建很多類似的提示框,但是這些提示框又不完全相同,操作流程又大致一樣,因此就希望以某種快速的方式創建這些提示框。
實現思路:
用一個基類來實現所有公共復用部分,暴露接口,供子類調用。我們自定義的提示框只關注提示框UI本身,其他邏輯部分全部交由基類出題,當然,我們自定義的提示框類此時就應該繼承該基類來創建。這個基類與其說是將邏輯部分進行復用的一個基類,也可看作是一個方法工廠類,因為它里面封裝了很多供子類調用的方法。
基類主要任務
- 封裝展示和隱藏該提示框的動畫效果
- 初始化背景視圖,并給其添加點擊事件。(子類調用父類實現的初始化方法類初始化實例)
- 添加鍵盤事件。(方便處理有輸入框的提示框,同理有也可以添加定時器,讓提示框自動關閉)
- 移除背景點擊事件。(默認添加,在不需要的時候可調用該方法)
基類方法
/**
* 以下方法在父類實現,給子類調用
*/
/*!
@brief 添加鍵盤監聽事件,當用到輸入框的彈框的時候,子類需要調用
*/
- (void) addKeyborder;
/*!
@brief 展示當前的視圖,把展示動畫封裝在父視圖里面,方便子類調用,當要改變動畫效果的時候,可以在這個方法修改
*/
- (void) showAlertView;
/*!
@brief 方法作用和上面一個方法相同,增加了一個視圖顯示完成的回調
@param complete 視圖顯示完成回調
*/
- (void) showAlertViewComplete:(void(^)(void))complete;
/*!
@brief 隱藏視圖(將視圖移除父視圖),也是將隱藏動畫封裝在父視圖,子類需要直接調用,需要修改隱藏動畫的時候直接在該方法修改
*/
- (void) hiddenAlertView;
/*!
@brief 移除背景視圖的點擊手勢,默認背景視圖有點擊效果,點擊背景,彈框視圖消失,調用該方法可以取消該點擊效果
*/
- (void) removeBgViewTapEvent;
子類(具體實現類)主要任務
- 創建該視圖的UI
- 調用基類方法實現邏輯
這里子類創建和初始化我采用了這種方式,感覺使用起來比較方便:
子類只暴露一個唯一的類方法與外界交互,外界數據由參數傳入,內部操作結果有block回調處理,最后該類方法也返回該類實例(也許方法迭代會有用),內部的事件傳遞用一個私有的block實現。
eg:
.h文件代碼
#import "LJBaseAlertView.h"
/**
* 用于測試的正常自定義彈框(不帶輸入框的)
*/
@interface LJNormalAlertView : LJBaseAlertView
/*!
@brief 使用類方法展示該視圖,并通過block回調將操作結果放回
@param content 展示內容文本
@param sureBtnClicked 確定按鈕點擊回調,取消按鈕沒有回調,需要可以在后面添加
@return 返回創建的視圖,有利于進行方法迭代
*/
+ (LJNormalAlertView *) showNormalAlertWithContent:(NSString *)content sureBtnClicked:(void(^)(void))sureBtnClicked;
@end
.m文件代碼
#import "LJNormalAlertView.h"
@interface LJNormalAlertView ()
@property (weak, nonatomic) IBOutlet UILabel *contentLabel;
/**用block進行事件傳遞*/
@property (nonatomic, copy) void(^(sureBtnClicked))(void);
@end
@implementation LJNormalAlertView
- (IBAction)cancelButtonClicked:(UIButton *)sender {
//調用父類方法將視圖移除
[self hiddenAlertView];
}
- (IBAction)sureButtonClicked:(UIButton *)sender {
//傳遞事件
if (self.sureBtnClicked) {
self.sureBtnClicked();
}
//調用父類方法將視圖移除
[self hiddenAlertView];
}
/**
* 展示視圖,對視圖進行初始化,并對它的參數進行設置
*/
+ (LJNormalAlertView *)showNormalAlertWithContent:(NSString *)content sureBtnClicked:(void (^)(void))sureBtnClicked {
LJNormalAlertView *normalAlert = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([LJNormalAlertView class]) owner:nil options:nil] lastObject];
//設置frame,可根據content內容進行計算
normalAlert.frame = CGRectMake(13, ([UIScreen mainScreen].bounds.size.height - 200) / 2.0, [UIScreen mainScreen].bounds.size.width - 26, 200);
normalAlert.contentLabel.text = content;
normalAlert.sureBtnClicked = sureBtnClicked;
//調用父類方法顯示視圖
[normalAlert showAlertView];
return normalAlert;
}
@end
使用上面思路,將大部分可復用代碼放在基類,實現代碼復用,用一個類方法調用展示視圖,回調處理結果,簡化代碼。