最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

首先,如果就按照如下的默認(rèn)寫法:

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

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

會(huì)有什么問題呢?注意控制臺(tái),肯定會(huì)輸出

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

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

另一種情況,如果是自定義的 Alert ,你把它 add 為 window 的子視圖,這么做第二個(gè)彈框會(huì)蓋在第一個(gè)上面。如果你用了毛玻璃背景,效果會(huì)更加明顯??隙ú缓线m了。

所以,正確的解決辦法就是類似加鎖的過程,當(dāng)點(diǎn)擊了第一個(gè)彈框的某個(gè)按鈕之后,再?gòu)棾龅诙€(gè)彈框,以此類瑞。

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

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

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

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

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

我們?cè)诋惒骄€程等待信號(hào),在主線程發(fā)信號(hào),如此就可以實(shí)現(xiàn)兩個(gè)線程同步。其實(shí)信號(hào)量就是一種鎖。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS自動(dòng)移除KVO觀察者的實(shí)現(xiàn)方法

    iOS自動(dòng)移除KVO觀察者的實(shí)現(xiàn)方法

    在 Apple 的應(yīng)用開發(fā)里 KVO 提供了一個(gè)途徑,使對(duì)象(觀察者)能夠觀察其他對(duì)象(被觀察者)的屬性,當(dāng)被觀察者的屬性發(fā)生變化時(shí),觀察者就會(huì)被告知該變化。下面這篇文章主要給大家介紹了關(guān)于iOS如何自動(dòng)移除KVO觀察者的實(shí)現(xiàn)方法,需要的朋友可以參考下。
    2017-12-12
  • iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程

    iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程

    這篇文章主要介紹了iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程,即用UINavigationController來編寫navigation,示例代碼為Objective-C語言,需要的朋友可以參考下
    2016-02-02
  • iOS實(shí)現(xiàn)滾動(dòng)字幕的動(dòng)畫特效

    iOS實(shí)現(xiàn)滾動(dòng)字幕的動(dòng)畫特效

    這篇文章給大家?guī)硪豢顟?yīng)用非常實(shí)用的控件,滾動(dòng)字幕,可以應(yīng)用在新聞、財(cái)經(jīng)、聊天等各類APP上,B格瞬間提升了一個(gè)檔次有木有,下面跟著小編一起看看如何實(shí)現(xiàn)的吧。
    2016-09-09
  • IOS開發(fā)之路--C語言存儲(chǔ)方式和作用域

    IOS開發(fā)之路--C語言存儲(chǔ)方式和作用域

    只有你完全了解每個(gè)變量或函數(shù)存儲(chǔ)方式、作用范圍和銷毀時(shí)間才可能正確的使用這門語言。今天將著重介紹C語言中變量作用范圍、存儲(chǔ)方式、生命周期、作用域和可訪問性。
    2014-08-08
  • 詳解iOS 輕松獲取當(dāng)前控制器的正確方式

    詳解iOS 輕松獲取當(dāng)前控制器的正確方式

    這篇文章主要介紹了詳解iOS 輕松獲取當(dāng)前控制器的正確方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • iOS App中調(diào)用iPhone各種感應(yīng)器的方法總結(jié)

    iOS App中調(diào)用iPhone各種感應(yīng)器的方法總結(jié)

    Xcode環(huán)境中包含CoreMotion框架,能夠幫助我們調(diào)用硬件設(shè)備的加速度傳感器和陀螺儀等感應(yīng)器,下面比較詳細(xì)地整理了iOS App中調(diào)用iPhone各種感應(yīng)器的方法總結(jié),需要的朋友可以參考下:
    2016-07-07
  • IOS代碼筆記之網(wǎng)絡(luò)嗅探功能

    IOS代碼筆記之網(wǎng)絡(luò)嗅探功能

    這篇文章主要為大家詳細(xì)介紹了IOS網(wǎng)絡(luò)嗅探功能實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • iOS中創(chuàng)建Model的最佳實(shí)踐記錄

    iOS中創(chuàng)建Model的最佳實(shí)踐記錄

    這篇文章主要給大家介紹了關(guān)于iOS中創(chuàng)建Model的最佳實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • IOS 遠(yuǎn)程通知兼容(IOS7,IOS8)實(shí)例詳解

    IOS 遠(yuǎn)程通知兼容(IOS7,IOS8)實(shí)例詳解

    這篇文章主要介紹了IOS 遠(yuǎn)程通知兼容(IOS7,IOS8)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • iOS遍歷集合(NSArray、NSDictionary、NSSet)的方法總結(jié)

    iOS遍歷集合(NSArray、NSDictionary、NSSet)的方法總結(jié)

    這篇文章主要介紹了iOS集合遍歷(NSArray、NSDictionary、NSSet)的方法,文中給出了詳細(xì)的方法示例,并總結(jié)了各個(gè)方法的優(yōu)缺點(diǎn)來供大家學(xué)習(xí)參考,需要的朋友們下面來一起看看吧。
    2017-03-03

最新評(píng)論

习水县| 荃湾区| 鹤壁市| 逊克县| 桓台县| 四子王旗| 昌吉市| 广德县| 梨树县| 永昌县| 道孚县| 沾益县| 崇明县| 普安县| 郴州市| 阳信县| 江华| 利津县| 重庆市| 景宁| 屏边| 墨竹工卡县| 武夷山市| 辽阳市| 黔东| 阳原县| 淮滨县| 阿克苏市| 宁海县| 朝阳县| 宿松县| 绥棱县| 广宗县| 中宁县| 金昌市| 宝丰县| 平乡县| 光山县| 延长县| 恩施市| 闸北区|