2011-01-23 24 views
10

tôi đang tạo ra và bắn một NSTimer với:iPhone - NSTimer không lặp lại sau vụ hỏa hoạn

ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
             selector:@selector(handleTimer:) 
             userInfo:nil 
              repeats:YES]; 
[ncTimer fire]; 

- (void)handleTimer:(NSTimer *)chkTimer { 
    // do stuff 
} 

Tôi giữ lại bộ đếm thời gian của tôi với:

@property (nonatomic, retain) NSTimer *ncTimer; 

Đối với một số lý do bộ đếm thời gian không lặp lại. Nó chỉ bắn một lần và hơn bao giờ hết.

+0

* Một câu hỏi ngu ngốc trên một phần của tôi, nhưng tốt nhất để đảm bảo: * Tôi đoán bạn không làm vô hiệu các bộ đếm thời gian bất cứ nơi nào bên trong phương pháp handleTimer? –

+0

Không, tôi không phải .. điều duy nhất tôi phải thêm là tôi đang kích hoạt bộ đếm thời gian trong phương thức viewDidLoad – Zigglzworth

Trả lời

7

Bạn không thể chỉ gán cho bộ đếm thời gian mà bạn đã đặt như một thuộc tính trong phần đầu của bạn. Điều này sẽ hoạt động:

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];

Ngoài ra: Phương pháp lửa kích hoạt hẹn giờ, hết chu kỳ. Nếu bộ đếm thời gian không lặp lại thì nó không hợp lệ. Sau dòng ghi lửa, hãy thêm dòng này:


BOOL timerState = [ncTimer isValid]; 
NSLog(@"Timer Validity is: %@", [email protected]"YES":@"NO"); 
+1

"Thời gian hẹn giờ là: CÓ" nhưng vẫn không có may mắn ... bộ định thời không lặp lại. Vấn đề ở đây là gì? – Zigglzworth

+0

Tôi vừa tạo ra một ứng dụng thử nghiệm nhỏ để xem điều gì đã xảy ra và nó hoạt động tốt cho tôi với bản thân. Bạn có @synthesize ncTimer ở ​​đầu triển khai của bạn không? –

+0

Vâng tôi đã nhận được rằng ... Tôi đã làm điều này trong nhiều ứng dụng khác và làm việc tốt của nó vì vậy tôi không thể tìm ra whats sai ở đây – Zigglzworth

3

Gán cho ncTimer vì bạn sẽ không khởi tạo thuộc tính retain chức năng.

Giả sử việc kê khai nằm trong đối tượng thành viên bạn sẽ cần phải làm:

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES] 
+0

Tôi đã thêm tự. nhưng vấn đề vẫn tồn tại – Zigglzworth

34

Phương pháp -fire: tự kích hoạt thủ công một lần. Đối với một bộ đếm thời gian để được bắt đầu và lặp lại, bạn cần phải thêm nó vào một runloop sử dụng [[NSRunLoop currentRunLoop] addTimer: forMode:]

+14

Điều này là đúng, nhưng nó đơn giản hơn để sử dụng 'NSTimer'' scheduleTimerWith ... 'phương pháp thay vì tự thêm vào vòng lặp chạy . –

19

Got it

Thêm hẹn giờ để mainRunLoop khiến nó làm việc

Ở đây bạn đi:

Objective C :

self.ncTimer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

Swift:

var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true) 
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode) 
+0

Không phải Mục tiêu C là 'NSTimer * ncTimer' thay vì' self.ncTimer'? Ngoài ra, bạn sẽ không nói 'addTimer: ncTimer' thay vì' addTimer: timer'? Tôi có sức mạnh để chỉnh sửa điều này, nhưng tôi muốn bạn biết về những gì cần phải làm. – Volomike

+0

Tôi cũng vậy, điều này làm việc cho tôi nhưng 'scheduleTimerWithTimeInterval' không – Husam

6

Bạn cũng có thể sao chép mã của mình bên trong khối này, thao tác này sẽ tạo bộ hẹn giờ trong chuỗi chính.

Mã sẽ do đó duy trì:

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
       target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES]; 
}); 
Các vấn đề liên quan