我有一堆視圖控制器(嵌入式導航控制器),我需要在進入下一個屏幕之前進行一些異步調用。問題是我需要在單擊映射到segue的按鈕時進行此調用,但由於異步調用尚未返回,因此會生成segue並顯示下一個視圖控制器。在異步調用返回之前,人們如何做這種事情來防止視圖控制器導航發生?在進入下一個視圖控制器之前進行異步調用(Swift)
6
A
回答
5
TL發生把東西放回主線程; DR你可以爲UIButton
創建一個@IBAction
,並在該函數內部進行異步調用,並在使用dispatch_async(dispatch_get_main_queue()) {}
的completionHandler中手動啓動segue。
要從UIViewController
創建賽格瑞手動只是按Ctrl + 拖動到下一個像下面的圖片:
然後你會看到選擇賽格瑞的類型像這樣的畫面:
你選擇Show
類型,你可以看到的視圖層次結構中的SEGUE你左手後選擇它在這張圖片設置爲SEGUE標識,如:
您可以處理你的問題,推出手動segue
與函數performSegueWithIdentifier
,你可以在網上參考找到很多關於如何使用Interface Builder手動創建segue的教程。
一旦你Segue公司已經創造了你可以調用它在任何你想要的,你的情況,你會稱這是異步的completionHandler裏面叫你需要把在主線程使用的dispatch_async(dispatch_get_main_queue()) {}
功能大中央調度。
事情是這樣的代碼:
@IBAction func buttonTapped(sender: AnyObject) {
asyncFunction() {
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("someID", sender: sender)
}
}
}
編輯: 注意,在斯威夫特3的語法發生了變化:
@IBAction func buttonTapped(_ sender: AnyObject) {
asyncFunction() {
DispatchQueue.main.async {
self.performSegueWithIdentifier("someID", sender: sender)
}
}
}
我希望這可以幫助你。
-4
相關問題
- 1. 在配置視圖之前可以進行異步調用嗎?
- 2. 瀏覽器通過異步控制器進行的Ajax調用
- 3. 調用Swift中的前一個視圖控制器
- 4. IOS Swift,代表在兩個視圖控制器之間進行通信
- 5. 在進行下一步調用strtok(NULL)重複當前一個
- 6. 在春季調用控制器之前進行預檢查MVC
- 7. 從一個視圖控制器到另一個視圖控制器進行委託調用
- 8. 在控制器之前執行視圖?
- 9. 在同步內進行異步調用
- 10. 在同一視圖的視圖之間進行iOS切換控制器
- 11. 得到NSURLSession下載所有視圖控制器進步
- 12. 在rails控制器中使用回調進行並行異步處理
- 13. swift - 進入前臺後的視圖
- 14. 在控制進入共享庫之前捕獲一個系統調用
- 15. 在進入下一步之前等待一段時間
- 16. 在當前視圖控制器下加載視圖控制器
- 17. Swift - 視圖控制器調用兩次
- 18. 在控制器和視圖之間進行修改的實體
- 19. emberjs如何在控制器和視圖之間進行通信?
- 20. 在視圖控制器之間進行通信
- 21. iphone - 在segue後與之前的視圖控制器進行通信
- 22. 調用警報控制器後調用下一個視圖控制器
- 23. 做一個onclick函數進入模型,視圖或控制器?
- 24. C#同步進行異步調用
- 25. 是否需要在移動到下一個視圖控制器之前關閉視圖控制器
- 26. 在一個視圖控制器中的兩個表視圖swift
- 27. 在一個視圖控制器中的兩個表視圖swift
- 28. Swift 3 - 異步作業後關閉視圖控制器
- 29. 在進入之前加載一個tabBar視圖
- 30. 寫一個異步控制器和更新進度
你有任何代碼可以顯示嗎? – iamalizade
不要,而是在新的控制器中執行 – Wain
我無法在下一個控制器中執行此操作,因爲只有在異步方法成功時纔會顯示下一個視圖控制器。 – u84six