簡體   English   中英

為什么簡單的模態視圖控制器在顯示和關閉時會滯后?

[英]Why would a simple modal view controller lag when presented and dismissed?

我的應用程序的主視圖是UIImagePickerController相機視圖。 當應用程序變為活動狀態(在didBecomeActive中)時,我將提供一個模式視圖控制器,該控制器顯示從網絡請求生成的一些設置。 (請注意,出於調試目的,我取出了網絡請求,目前僅顯示一個虛擬視圖)

模態視圖動畫流暢,但加載后凍結3秒鍾,然后正常響應。 消除視圖(動畫效果也很流暢)后,我的圖像選擇器控制器暫停2秒鍾,然后正常恢復。

我已從模態視圖控制器中刪除了所有功能,以確保沒有任何操作阻塞主線程。 我介紹了最基本的控制器,但仍然得到了不穩定的ui。 我會懷疑這是由於我的呈現視圖控制器調用了viewDidLoad / Unload或類似的東西,但是當顯示模式視圖時,我的搜索沒有提供有關呈現視圖控制器中調用了哪些委托方法的任何信息。

我的問題可以通過回答來解決:

  • 顯示模式視圖時,在演示者中調用了哪些委托方法?
  • (如果有^)我如何不能調用這些方法,或者使它們運行得更流暢?
  • 模態視圖控制器有哪些常見的陷阱?

有多種調用方法。 ViewDidLoad ViewWillAppear ViewDidAppear ViewWillDisappear ViewDidDisappear。 檢查所有這些方法。 另外,檢查您創建的所有子視圖,並查看它們是否在我聲明的方法中的線程上進行了涉及圖像加載的任何操作。 模擬器和測試設備中也會發生這種情況嗎?

ModalViewControllers沒有太多陷阱,但可以了解在諸如導航堆棧之類的東西上分配了多少個視圖,以及彼此之間有多少個視圖。 當您擺脫模態視圖控制器時,您會調用dismissviewcontroller嗎?

這可能是因為您在主線程中進行了大量處理(通常是在UI停止時,這是因為主線程處理了)。 嘗試為我們提供一些代碼,特別是您認為最重的處理代碼! 對不起我的英語不好:P! 嘗試使用以下命令將最繁重的代碼分發到另一個線程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //your heavy code here =)
});

問候,盧卡斯

可能造成一些輕微延遲的一件事是每次都從頭開始重新加載相同的viewController。

BProfileTableViewController * _profileViewController = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:profileViewController];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

您可以在此處看到,如果這是在tableView上單擊的,則每次應用程序需要再次創建viewController時,請單擊。 如果相反,我們只是重用視圖,那么它可以消除某些滯后。

將此添加到頭文件中

BProfileTableViewController * _profileView;

然后,模態視圖加載代碼更改為:

// Open the users profile
if (!_profileView) {
    _profileView = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
}

UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:_profileView];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

這意味着我們只是重新加載視圖,而不是重新創建視圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM