iOS 8.3 以後UIAlertView,跟UIActionSheet都不被推薦使用了,雖然一直知道如此,可是由於手裏的老代碼都是用的UIAlertView,因此歷來沒真正使用過這個UIAlertController。今天寫一個Demo用到提示框,因此試一下。html
##UIAlertControllerios
跟UIAlertView相比,UIAlertController再也不須要實現代理方法,也無需指定按鈕;建立方法:git
//建立控制器
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示:" message:@"我是一條信息" preferredStyle:UIAlertControllerStyleActionSheet];
複製代碼
特別注意第三個參數,它決定了樣式是對話框(alert)仍是上拉菜單(actionSheet)。github
建立好控制器以後,經過UIAlertAction來給控制器添加動做按鈕。bash
//建立動做按鈕:
UIAlertAction *action0 = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"OK selected");
}];
UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"Cancel selected");
}];
//把按鈕添加到控制器
[alertVC addAction:action0];
複製代碼
動做按鈕樣式共三張:default,destructive,cancel;值得注意的是若是控制器的樣式選擇了actionSheet,那麼它的destructive按鈕永遠在最前面,不管添加順序是怎樣的,cancel則永遠都在最後,並且只能有一個cancel類型的按鈕。spa
若是你的程序是寫在iPhone上的,那麼很不幸你基本跟下面的內容失之交臂了,而下面的內容纔是真正有趣的部分代理
因爲我寫demo的時候用的設備是iPad,因此當我經過上面的代碼嘗試actionSheet樣式的時候,我遇到了這個錯誤: code
那麼這是怎麼一回事呢?原來,在常規寬度的設備上,上拉菜單是以彈出視圖的形式展示。彈出視圖必需要有一個可以做爲源視圖或者欄按鈕項目的描點(anchor point)。而iOS8 以後,新出了一個UIPopoverPresentationController類來替代以前的UIPopoverController。htm
##UIPopoverPresentationController 給UIAlertController配置popoverPresentationController:ip
UIPopoverPresentationController *popover = alertVC.popoverPresentationController;
if (popover) {
popover.sourceView = sender;
popover.sourceRect = sender.bounds;
popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
}
[self presentViewController:alertVC animated:YES completion:nil];
複製代碼
iOS 8以後,咱們再也不須要給出彈出框的大小,UIAlertController將會根據設備大小自適應彈出框的大小。而且在iPhone或者緊縮寬度的設備中它將會返回nil值。
配置好了popoverPresentationController,不管是在iPhone還iPad上,都沒問題咯。
最後,UIAlertController的popoverPresentationController取消了Canle樣式的action,由於用戶經過點擊彈出視圖外的區域也能夠取消彈出視圖,所以不須要了。