2010-11-19 75 views
2

我有一個UITableViewController與其默認UITableView。我開始用手指慢慢地拖動桌子進行滾動,即不用手指輕彈它。每當表格在屏幕上移動時,控制器的scrollViewDidScroll方法被調用;當我指定的某些條件得到滿足時,其中一個撥打scrollViewDidScroll的電話將使用performSelector:withObject:afterDelay在稍後時間安排某些操作。在UITableView被拖動時,performSelector無法運行?

但是,我發現在我釋放手指之前該操作不會執行。例如,如果我將afterDelay參數設置爲2秒,但握住我的手指5秒鐘,當釋放我的手指並執行動作時,它遲了3秒。有什麼方法可以讓手指(即更新UI,因此必須在主線程中運行)在手指仍然靠在屏幕上時執行?

謝謝!

+0

對於其他人的將來參考: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom – 2012-03-29 18:58:52

回答

8

這是因爲當一個UIScrollView(UITableView的超類)正在滾動時,它會更改其runloop以優先於任何應用程序正在執行的scrollView。這是爲了確保滾動儘可能平滑。

嘗試使用這個版本的延遲的方法:

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes; 

的模式,我建議使用包含以下內容的數組開始: [[NSRunloop currentRunLoop] currentMode]NSDefaultRunLoopMode

+2

謝謝你的回答!它真的幫助了我。但是稍微不同的數組:[NSArray arrayWithObject:NSRunLoopCommonModes] – Miroslav 2013-12-23 13:47:44

+0

NSRunLoopCommonModes使延遲執行工作。謝謝米羅斯拉夫 – mitrenegade 2014-10-31 14:26:21

+0

非常感謝你!你拯救我的一天!) – user2154220 2015-06-09 18:22:49