一、首先來看一下效果圖
二、具體實現
我們參照系統的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的步驟如下:
- 創建xib文件和與之對應的cocoaclass文件用於管理xib文件中的視圖。
- 仿照系統某個視圖的創建方法,給自定義的視圖文件定義相關的方法
- 實現子控件事件的方法,如果有數據回調,可以用block進行回調。