2012-06-28 27 views
12

Tôi đang cố gắng để ứng dụng của mình thực hiện một hành động sau khi trì hoãn, nhưng nó sẽ phải được thực hiện KHI người dùng tương tác/cuộn trên UIScrollView.iOS: Thực hiện hành động sau thời gian trong khi người dùng đang tương tác/cuộn

Tôi không chắc tại sao không phải performSelector:withObject:afterDelay hoặc scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: sẽ kích hoạt. Có phải vì họ đang ở trên một chủ đề nền?

Bất kỳ đề xuất hoặc trợ giúp nào?

+0

gì không được làm việc với performSelector: afterDelay :? Bạn đang cố gắng làm gì? Bạn có chắc chắn họ không kích hoạt - tức là bạn đặt một câu lệnh NSLog vào để kiểm tra? –

+0

Tôi đã đưa vào một tuyên bố tường trình. Nó sẽ kích hoạt sau khi người dùng ngừng tương tác với màn hình. Tôi đang cố cập nhật nhãn. – RileyE

+0

Tôi đã tìm thấy điều này: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom, nhưng không có cách nào để kết hợp sự chậm trễ với điều đó. – RileyE

Trả lời

23

Cả hai NSTimerperformSelector:withObject:afterDelay: theo mặc định chỉ kích hoạt ở chế độ vòng lặp chạy bình thường. Khi cuộn, vòng lặp chạy đang ở chế độ theo dõi sự kiện.

Bạn cần phải lên kế hoạch hành động theo thời gian của bạn trong tất cả các chế độ chung:

NSTimer *timer = [NSTimer timerWithTimeInterval:0.016 target:self selector:@selector(fire:) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

hoặc

[self performSelector:@selector(fire:) withObject:nil afterDelay:1.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; 

Ngoài ra còn có các chuyên NSEventTrackingRunLoopMode.

+0

Vì vậy, nó giống như những gì tôi có trong nhận xét? – RileyE

+0

@ RileyE Tôi không chắc tôi hiểu ý của bạn là gì. Nhận xét nào? –

+0

Xin lỗi. Tôi đang rất mơ hồ! Nhận xét nơi tôi đề cập đến bài đăng mà tôi đã xem trước đây. Bài đăng là: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom – RileyE

4

Đảm bảo trình kích hoạt bị trễ xảy ra trên NSRunLoopCommonModes. Mặc định là NSDefaultRunLoopMode sẽ không nhận được thư trong khi ví dụ: cuộn.

[self performSelector:@selector(fire:) withObject:nil afterDelay:2.0 inModes:@[NSRunLoopCommonModes]]; 

Hoặc bạn có thể sử dụng GCD mà cũng cư xử theo cùng một cách (không chắc chắn mà runloop chế độ nó sử dụng)

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    <#code to be executed on the main queue after delay#> 
}); 
0

Đối Swift:

performSelector(#selector(fire:), withObject: sender, afterDelay: 1.0, inModes: [NSRunLoopCommonModes]) 
Các vấn đề liên quan