2010-06-14 18 views
24

Được rồi, tôi đã tìm kiếm trực tuyến và thậm chí đã xem một vài cuốn sách để tìm câu trả lời vì tôi không thể hiểu tài liệu về táo cho NSTimer. Tôi đang cố gắng để thực hiện 2 giờ trên cùng một cái nhìn mà mỗi có 3 nút (START - STOP - RESET).Ví dụ về bộ đếm thời gian trên iPhone cơ bản

Bộ đếm thời gian đầu tiên đếm ngược từ 2 phút và sau đó phát ra tiếng bíp.

Đồng hồ thứ hai tính từ 00:00 vô thời hạn.

Tôi giả sử rằng tất cả các mã sẽ được viết bằng các phương pháp đằng sau 3 nút khác nhau nhưng tôi hoàn toàn mất việc cố đọc tài liệu về táo. Mọi sự trợ giúp sẽ rất được trân trọng.

+0

xem http://stackoverflow.com/questions/3519562/how-do-i-write-a-timer-in-objective-c –

Trả lời

35

Về cơ bản những gì bạn muốn là sự kiện kích hoạt sau mỗi 1 giây, hoặc có thể vào khoảng thời gian 1/10 giây và bạn sẽ cập nhật giao diện người dùng của mình khi đồng hồ đếm ngược.

Sau đây sẽ tạo bộ hẹn giờ và thêm bộ hẹn giờ vào vòng lặp chạy của bạn. Lưu bộ hẹn giờ ở đâu đó để bạn có thể tiêu diệt nó khi cần.


- (NSTimer*)createTimer { 

    // create timer on run loop 
    return [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTicked:) userInfo:nil repeats:YES]; 
} 

Bây giờ viết một handler cho bộ đếm thời gian đánh dấu:

 
- (void)timerTicked:(NSTimer*)timer { 

    // decrement timer 1 … this is your UI, tick down and redraw 
    [myStopwatch tickDown]; 
    [myStopwatch.view setNeedsDisplay]; 

    // increment timer 2 … bump time and redraw in UI 
    … 
} 

Nếu người dùng chạm vào một nút, bạn có thể thiết lập lại đếm, hoặc bắt đầu hoặc ngừng tích tắc. Để kết thúc bộ hẹn giờ, hãy gửi tin nhắn không hợp lệ:


- (void)actionStop:(id)sender { 

    // stop the timer 
    [myTimer invalidate]; 
} 

Hy vọng điều này sẽ giúp bạn.

+0

Trước hết, cảm ơn bạn rất nhiều vì đã giúp nhưng tôi vẫn còn một chút bối rối. Tôi sử dụng gì cho UILabel và IBAction? Mã của bạn dường như không có những thứ nên ở trong đó - phải không? – startuprob

+0

Tôi * rất cao * khuyên bạn nên chọn một bản sao của cuốn sách Aaron Hillegass, Ca cao (R) Lập trình cho Mac (R) OS X (ấn bản thứ 3). Nếu bạn đọc điều này và làm việc thông qua các ví dụ, bạn sẽ đạt được một sự hiểu biết vững chắc về Objective-C và Cocoa, bao gồm cả bộ dựng giao diện. Thành thật mà nói, với $ 30 và một thời gian, đó có lẽ là đầu tư tốt nhất bạn có thể thực hiện. Gotta chạy, em bé để nuôi! –

+0

Có, để trả lời nhận xét của bạn, tôi đã bỏ qua việc triển khai giao diện người dùng của bạn. Bạn đang đúng, bạn cần một UIWindow, với một UIView có chứa một số điều khiển mà sẽ tạo ra các sự kiện khi người dùng chạm vào chúng. Các sự kiện sẽ cần phải được định tuyến tới các phương thức được gắn thẻ IBAction trong bộ điều khiển khung nhìn của bạn. Và như bạn đã nói, một UILabel hoặc hai để giữ đồng hồ bấm giờ của bạn đọc. –

11

Tôi sẽ thực hiện theo phương pháp của Jonathan, ngoại trừ bạn nên sử dụng NSDate làm tài liệu tham khảo để cập nhật giao diện người dùng. Có nghĩa là thay vì cập nhật đánh dấu dựa trên NSTimer, khi NSTimer kích hoạt, bạn có sự khác biệt giữa NSDate cho bây giờ và ngày tham chiếu của bạn.

Lý do cho điều này là NSTimer có độ phân giải 50-100 ms có nghĩa là bộ hẹn giờ của bạn có thể trở nên khá không chính xác sau một vài phút nếu có nhiều thứ xảy ra để làm chậm thiết bị. Sử dụng NSDate làm điểm tham chiếu sẽ đảm bảo rằng độ trễ duy nhất giữa thời gian thực tế và thời gian được hiển thị là trong việc tính toán sự khác biệt đó và hiển thị của màn hình.

+1

Tôi biết điều này là cũ, nhưng bất cứ ai đi qua nó: NSTimer thực sự giữ lại độ phân giải giữa đám cháy, có nghĩa là nó sẽ luôn chính xác với độ phân giải 50-100 ms, không bao giờ (dưới bất kỳ điều gì ngoài trường hợp cực đoan) tệ hơn thế. Xem Dung sai thời gian trong [NSTimer documenation] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/). – nickRise

+0

@robotpsyche là đúng, tôi đã thử sử dụng 'NSTimer' trên hai thiết bị (iphone và ipad), đoán xem, trong 20 phút sự khác biệt giữa các bộ đếm thời gian là 12 giây !!!, điều này là không thể chấp nhận được, tôi sẽ sử dụng' NSDate'. –

Các vấn đề liên quan