我有一堆視圖控制器(嵌入式導航控制器),我需要在進入下一個屏幕之前進行一些異步調用。問題是我需要在單擊映射到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. 在執行下一步之前需要進行多個異步調用JS
- 3. 瀏覽器通過異步控制器進行的Ajax調用
- 4. IOS Swift,代表在兩個視圖控制器之間進行通信
- 5. 從一個視圖控制器到另一個視圖控制器進行委託調用
- 6. 在控制器之前執行視圖?
- 7. 異步函數進行異步調用
- 8. 在同步內進行異步調用
- 9. 得到NSURLSession下載所有視圖控制器進步
- 10. 在rails控制器中使用回調進行並行異步處理
- 11. 在控制進入共享庫之前捕獲一個系統調用
- 12. 在當前視圖控制器下加載視圖控制器
- 13. swift - 進入前臺後的視圖
- 14. 在視圖控制器之間進行通信
- 15. emberjs如何在控制器和視圖之間進行通信?
- 16. iphone - 在segue後與之前的視圖控制器進行通信
- 17. C#同步進行異步調用
- 18. 在進入之前加載一個tabBar視圖
- 19. 在一個視圖控制器中的兩個表視圖swift
- 20. 在一個視圖控制器中的兩個表視圖swift
- 21. Swift 3 - 異步作業後關閉視圖控制器
- 22. Swift:從另一個視圖控制器調用ViewController func
- 23. swift - 從另一個視圖控制器調用代碼
- 24. 進行異步在ASP.Net MVC調用3
- 25. 在ComponentDidMount上進行異步API調用
- 26. 進步多個異步跟蹤調用
- 27. Xcode,點擊按鈕進入下一個視圖控制器崩潰
- 28. 在mIRC中進一步執行之前添加一個暫停
- 29. 在進行REST調用之前刪除控制器請求中的成員
- 30. 使用AjaxPro進行異步調用
你有任何代碼可以顯示嗎? – iamalizade
不要,而是在新的控制器中執行 – Wain
我無法在下一個控制器中執行此操作,因爲只有在異步方法成功時纔會顯示下一個視圖控制器。 – u84six