2014-10-20 96 views
21

我有一個基於標籤欄的應用程序。在所有5個選項卡中都有導航控制器,並將自定義視圖控制器實例設置爲根視圖控制器。這加載得很好。這些視圖控制器中的一些包含表視圖。我想在表格視圖中選擇一行時向用戶顯示模式視圖控制器。該didSelectRowAtIndexPath方法委託方法(的相關部分)如下所示:延遲呈現模態視圖控制器

SampleSelectorViewController *sampleVC = [[SampleSelectorViewController alloc] init]; 
[self presentViewController:sampleVC animated:YES completion:NULL]; 

模態視圖控制器顯示,但它很明顯的延遲後出現。有時甚至需要用戶再次點擊該行。我已經覈實有幾件事情是:當用戶點擊該行

  • 的didSelectRowAtIndexPath方法方法不包含任何阻塞調用

    • 表視圖的didSelectRowAtIndexPath方法方法被調用。沒有網絡操作正在執行,並且模態視圖控制器的設置不涉及任何處理密集型任務。它顯示的數據是靜態的。
    • 如果我將新的視圖控制器放到導航堆棧上(其他所有內容完全相同),它的行爲完全沒有任何延遲。只有在模態呈現時纔會遇到延遲。

    任何意見/建議?

  • +0

    出於興趣,是它同樣慢用'動畫:NO' ? – pbasdf 2014-10-20 15:30:18

    +0

    就是這樣。動畫似乎對這種奇怪的行爲沒有影響。 – 2014-10-20 15:40:15

    +0

    有趣。我遇到同樣的延遲模式顯示問題(或者不得不點擊屏幕使其顯示)。在我的情況下,它不是直接的,而是通過didSelectRowAtIndexPath間接觸發的。調用一個委託方法,它調用委託方法,它以模態方式呈現。嗯.. – 2017-08-10 05:29:57

    回答

    3

    您應該從根vc(例如:customTabBarRootViewController)模態顯示它。 保存一個參考,並使用參考控制器來顯示它。

    +0

    當你說root vc ,你的意思是在我的窗口中的根vc這將是我的標籤欄控制器在這種情況下? 另外,如果可能的話,我會非常感興趣的知道它的原因 – 2014-10-21 09:54:00

    +0

    我不知道原因我只知道它對我的工作完美無缺地運行iOS7的iPhone 4編譯xCode6.0.1 – Gilad 2014-10-21 11:08:15

    +0

    是的我的意思是選項卡如果在顯示的視圖控制器上存在「繁重的代碼」,請嘗試使用dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ { //您的沉重代碼在此=)來包裝它,否則它將保存它 – Gilad 2014-10-21 11:08:40

    36

    它似乎在呼叫presentViewController:animated:completiontableView:didSelectRowAtIndexPath:是有問題的。當在樂器中使用Time Profiler時,也很難找到任何突出的東西。有時候,我的模態觀點不到一秒鐘,有時需要4秒甚至9秒。

    我認爲它與底層的UIPresentationController和佈局有關,這是我在選擇連續點擊和查看Time Profiler中的模態演示文稿之間的時間區域時看到的少數幾個事情之一。

    的雷達存在說明這個問題:http://openradar.appspot.com/19563577

    解決方法很簡單,但不令人滿意:延遲呈現小幅避免任何有爭議的行爲是造成增長放緩。

    dispatch_async(dispatch_get_main_queue(), ^{ 
        [self presentViewController:nav animated:YES completion:nil]; 
    }); 
    
    +1

    謝謝你。你的修補程序適合我,但同意它有點不令人滿意。 – Rogare 2015-02-07 02:01:49

    +1

    謝謝azsromej的回覆。我有點卡在其他一些事情上。我會嘗試儘快驗證修復程序,如果它能正常工作,請接受您的答案,但在我能做到這一點之前可能會有一段時間。 – 2015-02-09 12:21:59

    +0

    這爲我修復http://stackoverflow.com/questions/29830698/uisearchcontroller-wont-dismiss-searchbar-and-overlap-for-ios-8-swift – DogCoffee 2015-11-21 11:26:51

    1

    tableView:didSelectRowAtIndexPath:看起來像蘋果的錯誤,我也有這個奇怪的延遲。

    雖然這個解決方案似乎工作得很好。

    CFRunLoopWakeUp(CFRunLoopGetCurrent()); // Fixes a bug where the main thread may be asleep, especially when using UITableViewCellSelectionStyleNone 
    
    2

    解在夫特3

    在SampleSelectorViewController(所呈現的視圖控制器)使用下面的代碼

    DispatchQueue.global(qos: .background).async { 
    
    // Write your code 
    
    } 
    
    +0

    您需要在主隊列中分派。所以使用:'DispatchQueue.main.async {}' – 2017-10-24 12:13:41

    相關問題