亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

iOS實現(xiàn)多個彈框按順序依次彈出效果

 更新時間:2020年08月24日 09:33:34   作者:Se7en丶瀟灑哥  
這篇文章主要為大家詳細介紹了iOS實現(xiàn)多個彈框按順序依次彈出效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

有時候會有這樣的需求:App 運行完,加載 RootVC ,此時需要做一些操作,比如檢查更新,之類的。此時可能會需要有2個甚至多個彈框依次彈出。

本篇將以系統(tǒng)的 UIAlertController 作為示例,當然,如果是自定義的,也要看一下這篇文章,如何來處理多個彈窗。

首先,如果就按照如下的默認寫法:

- (void)viewDidAppear:(BOOL)animated {
 [super viewDidAppear:animated];
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"彈框1" message:@"第一個彈框" preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
 [self presentViewController:alert animated:YES completion:nil];

 UIAlertController *alert2 = [UIAlertController alertControllerWithTitle:@"彈框2" message:@"第二個彈框" preferredStyle:UIAlertControllerStyleAlert];
 [alert2 addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
 [self presentViewController:alert2 animated:YES completion:nil];
}

會有什么問題呢?注意控制臺,肯定會輸出

Warning: Attempt to present <UIAlertController: 0x7ff4c3078c00>  on <SCTestViewController: 0x7ff4c2718c20> which is already presenting <UIAlertController: 0x7ff4c283ae00>

所以說,第二個彈框應(yīng)該是看不到的。

另一種情況,如果是自定義的 Alert ,你把它 add 為 window 的子視圖,這么做第二個彈框會蓋在第一個上面。如果你用了毛玻璃背景,效果會更加明顯。肯定不合適了。

所以,正確的解決辦法就是類似加鎖的過程,當點擊了第一個彈框的某個按鈕之后,再彈出第二個彈框,以此類瑞。

這里,我想到用信號量去解決,但是信號量會阻塞線程,不可以直接在主線程使用。所以我們需要在子線程控制信號量,在主線程創(chuàng)建和顯示 Alert,直接上代碼。

- (void)viewDidAppear:(BOOL)animated {
 [super viewDidAppear:animated];
 //創(chuàng)建一個隊列,串行并行都可以,主要為了操作信號量
 dispatch_queue_t queue = dispatch_queue_create("com.se7en.alert", DISPATCH_QUEUE_SERIAL);
 dispatch_async(queue, ^{
 //創(chuàng)建一個初始為0的信號量
 dispatch_semaphore_t sema = dispatch_semaphore_create(0);
 //第一個彈框,UI的創(chuàng)建和顯示,要在主線程
 dispatch_async(dispatch_get_main_queue(), ^{
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"彈框1" message:@"第一個彈框" preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 //點擊Alert上的按鈕,我們發(fā)送一次信號。
 dispatch_semaphore_signal(sema);
 }]];
 [self presentViewController:alert animated:YES completion:nil];
 });

 //等待信號觸發(fā),注意,這里是在我們創(chuàng)建的隊列中等待
 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
 //上面的等待到信號觸發(fā)之后,再創(chuàng)建第二個Alert
 dispatch_async(dispatch_get_main_queue(), ^{
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"彈框2" message:@"第二個彈框" preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 dispatch_semaphore_signal(sema);
 }]];
 [self presentViewController:alert animated:YES completion:nil];
 });

 //同理,創(chuàng)建第三個Alert
 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
 dispatch_async(dispatch_get_main_queue(), ^{
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"彈框3" message:@"第三個彈框" preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 dispatch_semaphore_signal(sema);
 }]];
 [self presentViewController:alert animated:YES completion:nil];
 });
 });
}

如此一來,就實現(xiàn)了我們的需求。

需要注意的是,這里為什么不用全局并發(fā)隊列,主要是考慮到信號量會阻塞線程,優(yōu)先級特別高,如果此時隊列中還有任務(wù),那么就會等待信號觸發(fā)。當然也有人故意這么做。對于 “彈框彈出的時間,不要做其他任何事情” 這種需求是很合適的。當然我們千萬不能去阻塞主線程!

我們在異步線程等待信號,在主線程發(fā)信號,如此就可以實現(xiàn)兩個線程同步。其實信號量就是一種鎖。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS關(guān)閉虛擬鍵盤方法匯總

    iOS關(guān)閉虛擬鍵盤方法匯總

    在iOS應(yīng)用開發(fā)中,有三類視圖對象會打開虛擬鍵盤,進行輸入操作,但如何關(guān)閉虛擬鍵盤,卻沒有提供自動化的方法
    2016-04-04
  • 在uiview 的tableView中點擊cell進入跳轉(zhuǎn)到另一個界面的實現(xiàn)方法

    在uiview 的tableView中點擊cell進入跳轉(zhuǎn)到另一個界面的實現(xiàn)方法

    這篇文章主要介紹了在uiview 的tableView中點擊cell進入跳轉(zhuǎn)到另一個界面的實現(xiàn)方法,首先重寫uiviewcontrol方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • iOS實現(xiàn)自動循環(huán)播放的banner實例詳解

    iOS實現(xiàn)自動循環(huán)播放的banner實例詳解

    輪播視圖通常也叫Banner,90%以上App都會用到的一個控件,網(wǎng)上有很多開源代碼,下面這篇文章主要給大家介紹了關(guān)于利用iOS如何實現(xiàn)自動循環(huán)播放的banner的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • iOS中奇妙的三目運算符示例詳解

    iOS中奇妙的三目運算符示例詳解

    大家都知道在oc中可以使用三目運算符來進行條件的判斷,這相對于if else 來說更加的簡潔,下面這篇文章主要給大家介紹了關(guān)于iOS中奇妙的三目運算符的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • iOS開發(fā)中使用UIDynamic來捕捉動畫組件的重力行為

    iOS開發(fā)中使用UIDynamic來捕捉動畫組件的重力行為

    這篇文章主要介紹了iOS開發(fā)中使用UIDynamic來捕捉動畫組件的重力行為的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-12-12
  • 詳解iOS中按鈕點擊事件處理方式

    詳解iOS中按鈕點擊事件處理方式

    在iOS開發(fā)中,時常會用到按鈕,通過按鈕的點擊來完成界面的跳轉(zhuǎn)等功能。具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • iOS App設(shè)計模式開發(fā)中對interpreter解釋器模式的運用

    iOS App設(shè)計模式開發(fā)中對interpreter解釋器模式的運用

    這篇文章主要介紹了iOS App設(shè)計模式開發(fā)中對interpreter解釋器模式的運用,示例為傳統(tǒng)的Objective-C寫成,需要的朋友可以參考下
    2016-04-04
  • iOS中UILabel實現(xiàn)長按復制功能實例代碼

    iOS中UILabel實現(xiàn)長按復制功能實例代碼

    在iOS開發(fā)過程中,有時候會用到UILabel展示的內(nèi)容,那么就設(shè)計到點擊UILabel復制它上面展示的內(nèi)容的功能,也就是Label長按復制功能,下面這篇文章主要給大家介紹了關(guān)于在iOS中UILabel實現(xiàn)長按復制功能的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • 詳解Objective-C中的語法糖@{}究竟是什么

    詳解Objective-C中的語法糖@{}究竟是什么

    這篇文章主要給大家介紹了關(guān)于Objective-C中語法糖@{}究竟是什么的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 掃描二維碼控件的封裝iOS實現(xiàn)

    掃描二維碼控件的封裝iOS實現(xiàn)

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)掃描二維碼控件的封裝,具有一定的實用性和參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評論