有時候會有這樣的需求:app 執行完,載入 rootvc ,此時需要做一些操作,比如檢查更新,之類的。此時可能會需要有2個甚至多個彈框依次彈出。
本篇將以系統的 uialertcontroller 作為示例,當然,如果是自定義的,也要看一下這篇文章,如何來處理多個彈窗。
首先,如果就按照如下的預設寫法:
- (void)viewdidappear:(bool)animated
會有什麼問題呢?注意控制台,肯定會輸出
warning: attempt to present on which is already presenting
所以說,第二個彈框應該是看不到的。
另一種情況,如果是自定義的 alert ,你把它 add 為 window 的子檢視,這麼做第二個彈框會蓋在第乙個上面。如果你用了毛玻璃背景,效果會更加明顯。肯定不合適了。
所以,正確的解決辦法就是類似加鎖的過程,當點選了第乙個彈框的某個按鈕之後,再彈出第二個彈框,以此類瑞。
這裡,我想到用訊號量去解決,但是訊號量會阻塞執行緒,不可以直接在主線程使用。所以我們需要在子執行緒控制訊號量,在主線程建立和顯示 alert,直接上**。
- (void)viewdidappear:(bool)animated ]];
[self presentviewcontroller:alert animated:yes completion:nil];
});//等待訊號觸發,注意,這裡是在我們建立的佇列中等待
dispatch_semaphore_wait(sema, dispatch_time_forever);
//上面的等待到訊號觸發之後,再建立第二個alert
dispatch_async(dispatch_get_main_queue(), ^]];
[self presentviewcontroller:alert animated:yes completion:nil];
});//同理,建立第三個alert
dispatch_semaphore_wait(sema, dispatch_time_forever);
dispatch_async(dispatch_get_main_queue(), ^]];
[self presentviewcontroller:alert animated:程式設計客棧yes completion:nil];
});});
}如此一來,就實現了我們的需求。
需要注意的是,這裡為什麼不用全域性併發佇列,主要是考慮到訊號量會阻塞執行緒,優先順序特別高,如果此時佇列中還有任務,那麼就會等待訊號觸發。當然也有人故意這麼做。對於 「彈框彈出的時間,不要做其他任何事情」 這種需求是很合適的。當然我們千萬不能去阻塞主線程!
我們在非同步執行緒等待訊號,在主線程發訊號,如此就可以實現兩個執行緒同步。其實訊號量就是一種鎖。
本文標題: ios實現多個彈框按順序依次彈出效果
本文位址:
在html中使用php語句實現彈框 彈框外掛程式整理
作者 明月。第一部分 彈框外掛程式的使用 第二部分 某b2c系統專案 以下簡稱專案 開發過程中遇到問題的總結 具體內容如下 第一部分 彈框外掛程式的使用 1.html 需要引入的外掛程式 2.js m3.以下是dialog外掛程式其他引數補充 第二部分 某b2c系統專案 以下簡稱專案 開發過程中遇到...
html實現彈框,並伴隨遮罩層,且彈框居中
本文介紹的內容主要實現的功能有,出現彈框,並且伴隨遮罩層,且彈框一直居中。html和js 聯絡客服 function showbox 顯示隱藏層和彈出層 function hidebox 去除隱藏層和彈出層 function contact css hidebg hidebox content bo...
yii2實現彈框
1.首先引入命名空間 use yii bootstrap modal useyii helpers url echo html a 來乙個彈框 id create data toggle modal data target create modal 關聯下面model的id屬性 class btn ...