根據基類快速創建自定義彈框視圖-AlertView

根據項目需求,有時我們創建很多類似的提示框,但是這些提示框又不完全相同,操作流程又大致一樣,因此就希望以某種快速的方式創建這些提示框。

實現思路:

用一個基類來實現所有公共復用部分,暴露接口,供子類調用。我們自定義的提示框只關注提示框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

使用上面思路,將大部分可復用代碼放在基類,實現代碼復用,用一個類方法調用展示視圖,回調處理結果,簡化代碼。

最后

demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 做人之快樂,就是做自己喜歡做的事,心有所持,持之以恒,恒久于心。不要在意別人在背后議論你什么,他們對你的認識和看法...
    yb0610閱讀 219評論 0 0
  • 今天下午七點零三分,我按照慣例打開微博,發現了這個軟件,于是懷著對于文字的一種熱愛,注冊了這個愛屁屁。隨手翻看...
    小二的木槿花閱讀 167評論 0 1
  • 貴州-重慶-四川 偶爾為街頭獨特的風景駐足,偶爾因高山流水的美麗停留,偶爾被驚鴻一瞥的美麗吸引;行進的腳步永不停歇...
    七街老酒八巷老友閱讀 188評論 0 1