自定義UIAlertController

一、首先來看一下效果圖

二、具體實現

我們參照系統的alertController的創建方法來寫我們自定義的alertController。

1.首先創建一個xib文件,這個文件作爲我們自定義的alertview的視圖文件,然後創建與之對應的cococlass文件。

2.然後寫一個類方法方面外界創建我們自定義的彈窗:

//LSRAlertView.m
+(LSRAlertView *)alertWithTitle:(NSString *)title andTitleImageName:(NSString *)imageName{
    LSRAlertView * view  = [[[NSBundle mainBundle]loadNibNamed:@"LSRAlertView" owner:self options:nil]firstObject];
    //爲保證安全,需要判斷參數是否完整
    if (!imageName||![imageName isEqual:@""]) {
        view.titleImageView.image = [UIImage imageNamed:imageName];
    }
    if (!title||![title isEqual:@""]) {
        view.messageLabel.text = title;
    }
    return view;
}

這和系統的創建alertController的方法類似,接着我們將xib文件中需要關聯的子控件關聯到這個類中(一般將這些子控件放到.m文件中,然後再頭文件中給出相應的接口)。

3.然後定義兩個方法,方便外界調用來顯示隱藏自定義的視圖:

//LSRAlertView.m
- (void)show{
    //將這個視圖添加到最外層的視圖上,就是  UIWindow-->addSubView;
    //1.首先找到當前這個應用的代理
    AppDelegate * delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    //2.然後根據代理找到當前這個窗口
    self.frame = [UIScreen mainScreen].bounds;
    [delegate.window addSubview:self];
}
-(void)dismiss{
    [self removeFromSuperview];
}

在show函數中,我們首先獲取到了這個app的代理,然後通過代理去找當前這個窗口,因爲 UIWindow是繼承於UIView,所以我們將我們的視圖添加到window上,這樣我們的視圖就和 rootviewcontroller 處於同一層級了:

4.這個時候我們就可以在viewcontroller中將這個自定義的alertView顯示出來了:

//viewcontroller.m
- (IBAction)buttonDidClicked:(UIButton *)sender {
    
    LSRAlertView * view = [LSRAlertView alertWithTitle:@"操作完成" andTitleImageName:@"gou"];
    //在這個控制器中如果需要這個view回調的數據就需要使用block,由於這個界面是需要數據的一方,所以就在
    //這裏寫block的具體操作,然後將這個block作爲參數傳回LSRAlertView中,在那個類裏面具體調用block
    [view addTopButtonWithTitle:@"確定" andHandle:^(NSString *parameter) {
        NSLog(@"%@",parameter);
    }];
    [view addBottomButtomWithTitle:@"取消" andHandle:^(NSString *parameter) {
        NSLog(@"%@",parameter);
    }];
    [view show];
}

關於其中block的部分下面會介紹到。

5.然後爲視圖中的按鈕控件添加事件,這個時候我們希望按鈕點擊後,viewcontroller 會接收到相應的信息或者數據,這就是數據回調,這裏我們使用block來實現數據的回調。

//LSRAlertView.m
- (IBAction)topButonClicked:(UIButton *)sender {
    /**調用傳遞過來的block*/
    self.sureBlock(@"第一個按鈕被點擊了");
}
- (IBAction)bottomButtonClicked:(UIButton *)sender {
    /**調用傳遞過來的block*/
    self.cancelBlock(@"第二個按鈕被點擊了");
    [self dismiss];
}
-(void)addTopButtonWithTitle:(NSString *)title andHandle:(SureBtnClickedBlock)block{
    //設置按鈕的標題
    [self.optiononeButton setTitle:title forState:UIControlStateNormal];
    //保存傳遞過來的代碼塊
    self.sureBlock = block;
}
-(void)addBottomButtomWithTitle:(NSString *)title andHandle:(CancelBtnClickedBlock)blcok{
    [self.optiontwoButton setTitle:title forState:UIControlStateNormal];
    self.cancelBlock = blcok;
}

我們定義兩個添加按鈕動作的方法,這些個方法帶了兩個參數,一個是按鈕的title,另一個就是block,block實際上就是一個代碼塊,和函數一樣,調用就會執行其中的代碼。我們寫這兩個方法,當在viewcontroller中調用這兩個方法時,就會傳遞給alertView對應按鈕控件一個block,然後我們在這兩個方法中定義了兩個block屬性變量,用來保存傳遞過來的block,可以理解爲傳遞了block代碼塊在內存中的地址。然後按鈕點擊觸發後就像調用函數那樣調用block,這樣就會去到viewcontroller中執行定義的block代碼塊,順帶將這個類中的信息作爲參數傳遞過去,我們這裏就簡單地打印了傳遞過來的數據:

三、總結

自定義alerrtController的步驟如下:

  1. 創建xib文件和與之對應的cocoaclass文件用於管理xib文件中的視圖。
  2. 仿照系統某個視圖的創建方法,給自定義的視圖文件定義相關的方法
  3. 實現子控件事件的方法,如果有數據回調,可以用block進行回調。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章