2015-04-20 16 views
39

Làm thế nào để tôi dừng lại hẹn giờ của tôi đang chạy? Không giống như một tạm dừng, nhưng dừng lại.Cách dừng NSTimer.scheduledTimerWithTimeInterval

import UIKit 

class LastManStandingViewController: UIViewController {  

@IBOutlet weak var timeLabel: UILabel! 
@IBOutlet weak var timeTextbox: UITextField! 
@IBOutlet weak var startButton: UIButton! 
@IBOutlet weak var stopButton: UIButton! 

var myCounter = 0 
var myTimer : NSTimer = NSTimer() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    timeLabel.text = String(myCounter) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func startTimer(){ 
    myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTimer"), userInfo: nil, repeats: true) 
    println("func startTimer") 
} 

func stopTimer(){ 
    myTimer.invalidate() 
    myCounter = 0 
    timeLabel.text = String(myCounter) 
    println("func stopTimer") 
} 

func updateTimer(){ 
    timeLabel.text = String(myCounter++) 
    println("func updateTimer") 
} 
@IBAction func startButton(sender: AnyObject) { 
    startTimer() 
} 
@IBAction func stopButton(sender: AnyObject) { 
    stopTimer() 
} 

}

tôi có thể bắt đầu hẹn giờ, nhưng khi tôi nhấn nút Stop, nó thiết lập lại chính nó, và bắt đầu đếm một lần nữa. Nó không dừng lại.

Làm cho nó hoạt động. Đã xảy ra lỗi với dự án của tôi! Đã sửa lỗi bằng cách xóa nút và thêm lại chúng. Hình như tôi đã có một bản sao hoặc một cái gì đó.

+0

Hãy gửi mã của bạn (chúng tôi không thể kiểm tra nó nếu nó chỉ là một ảnh chụp màn hình). – Moritz

+1

@ericd Đã thêm mã đầy đủ ngay bây giờ. –

+0

Tôi đã sao chép các bit quan trọng của mã của bạn trong một ứng dụng mẫu và tôi thấy không có vấn đề gì, bộ hẹn giờ bắt đầu và dừng lại chính xác. Bạn có chắc bạn không làm gì khác không? [ảnh chụp màn hình thử nghiệm của tôi] (https://www.evernote.com/shard/s89/sh/ca19d729-0a27-421f-bd79-19cfa7c503c8/25d3926720f64e01c47ae0eaaaa7f3ee/deep/0/AppDelegate.swift.png) – Moritz

Trả lời

75

Bạn không cần phải sử dụng Selector:

@IBAction func startButton(sender: AnyObject) { 
    myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTimer:", userInfo: nil, repeats: true) 
} 

Ngoài ra, bộ đếm thời gian trôi qua bản thân với phương pháp được lựa chọn, vì vậy bạn có thể vô hiệu hóa nó bên trong phương pháp này nếu bạn cần:

func updateTimer(timer: NSTimer) { 
    timeLabel.text = String(Counter++) 
    timer.invalidate() 
} 

Hoặc nếu bộ hẹn giờ là một biến mẫu:

myTimer.invalidate() 
myTimer = nil 

Đó là điều tốt để nil bộ đếm thời gian biến thể sau khi đã vô hiệu hóa nó, nó tránh nhầm lẫn hơn nữa nếu bạn cần tạo một bộ đếm thời gian khác với cùng một biến. Ngoài ra, tên phương thức và biến sẽ bắt đầu bằng chữ thường.

Ảnh chụp màn hình để hiển thị bộ tính giờ bị vô hiệu và được đặt thành không.

screenshot

Cập nhật cho Swift 2.2+

Xem https://stackoverflow.com/a/36160191/2227743 cho #selector cú pháp mới thay thế Selector().

7

bạn có thể sử dụng điều này khi một số điều kiện được đáp ứng và bạn muốn dừng timer:

Timer.invalidate() 

Dưới đây là ví dụ đơn giản:

func UpdateTimer(){ 
    timeLabel.text = String(Counter++) 
    if timeLabel.text == String("5") { 
     Timer.invalidate() 
    } 
} 

này sẽ ngừng hẹn giờ.

Bạn có thể sửa đổi nó theo nhu cầu của mình.

-3

Như trước Swift 2,2

let printTimer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(printDescription), userInfo: nil, repeats: true) 

func printDescription() { 
    print("Print timer will print every after 2.0 seconds") 
} 

In hẹn giờ sẽ in mỗi sau 2,0 giây

+0

Câu hỏi đặt ra là cách dừng một NSTimer.scheduledTimerWithTimeInterval. – Samball