真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

成都創(chuàng)新互聯(lián)公司專(zhuān)注于荊門(mén)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供荊門(mén)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),荊門(mén)網(wǎng)站制作、荊門(mén)網(wǎng)頁(yè)設(shè)計(jì)、荊門(mén)網(wǎng)站官網(wǎng)定制、微信小程序定制開(kāi)發(fā)服務(wù),打造荊門(mén)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供荊門(mén)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

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

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

- (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ì)有什么問(wèn)題呢?注意控制臺(tái),肯定會(huì)輸出

Warning: Attempt to present   on which is already presenting

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

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

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

這里,我想到用信號(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];
 });
 });
}

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


文章題目:iOS實(shí)現(xiàn)多個(gè)彈框按順序依次彈出效果
URL分享:http://weahome.cn/article/jdpjji.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部