Запуск счетчика при нажатии кнопки - PullRequest
0 голосов
/ 29 марта 2020

Я очень новичок в Swift и хочу, чтобы кнопка работала так: Нажмите кнопку и удерживайте. Пока кнопка нажата, значение метки увеличивается, как и каждую секунду +1, пока кнопка не будет отпущена.

Это то, что я до сих пор получаю:

    class ViewController: UIViewController {
        var counter = 0;
        override func viewDidLoad() {
            super.viewDidLoad();

        }

        @IBOutlet weak var label: UILabel!

        @IBAction func btn(_ sender: Any) {
            if (sender as AnyObject).state != .ended{
                counter+=1;
                // wait 100ms
                self.label.text = String (counter);
            }
        }
    }

Вот как я это связал:

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Этого можно добиться, используя действия UIButton Touch Down и Touch Up Inside

class ViewController: UIViewController {


var timer : Timer?
var startTime = 0 
var timerReset = true // I don't know what logic you want. This basically has been added so the number is not set to 0 immediately when you release the button. You can also add another button to reset startTime variable and the label

@IBOutlet weak var numberLabel: UILabel!
@IBOutlet weak var numberButton: UIButton!


override func viewDidLoad() {
    super.viewDidLoad()
    numberLabel.text = String(startTime) //initial value
    // Do any additional setup after loading the view.
}

@IBAction func holdingTheButton(_ sender: Any) {
    print("I am holding")
    timerReset = false // reset to false since you are holding the button
    guard timer == nil else { return }
    timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}

@IBAction func buttonReleased(_ sender: Any) {
    print("button released")
    startTime = 0
    timer?.invalidate()
    timer = nil
    timerReset = true // reset to true since you released. 
}

@objc func updateTime(){
    //update label every second
    print("updating label ")
    if timerReset {
        startTime = 0
    }
    startTime += 1
    numberLabel.text = String(startTime)
} 
}

ВАЖНО: Убедитесь, что вы подключаетесь правильно. Touch Down необходимо использовать, если вы хотите вызвать функцию, удерживая кнопку:

enter image description here

В вашей консоли вы должны увидеть, что это происходит если вы отпустите кнопку после 10 секунд:

enter image description here

Если вы хотите иметь кнопку для сброса, вы можете просто добавить ее, а затем подключить ее к следующей функции (но также убедитесь, что вы удалили bool timeReset и оператор if внутри updateTime:

@IBAction func resetTimer(_ sender: Any) {
  startTime = 0
  numberLabel.text = String(startTime)
}
0 голосов
/ 29 марта 2020

Вы можете достичь этого, используя два сенсорных события: UIButton и Timer.

var counter = 0
var timer: Timer?
@IBAction func buttonTouchUpInside(_ sender: Any) {
    timer?.invalidate()
    print(counter)
}

@IBAction func buttonTouchDown(_ sender: Any) {
    timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(increaseCount), userInfo: nil, repeats: true)
}

@objc func increaseCount() {
    counter += 1
    print(counter)
}

enter image description here

...