본문 바로가기

개발/Swift

[Swift] 타이머 생성하기

오늘은 30초 타이머를 생성하고, 30초가 지나면 Success! 라는 문구를 출력해보도록 하겠습니다.

 

이번에 진행할 전체코드입니다.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var infoLabel: UILabel!
    var timer = Timer() // 1. 타이머 초기화
  	var remainTime: Int = 0 // 2. 남은 시간 초기화

    override func viewDidLoad() {
        super.viewDidLoad()
  }

    @IBAction func timerPressed(_ sender: UIButton){
            //MARK: 타이머에 설정할 시간 세팅하기. 여기선 30초로 설정했습니다.
            remainTime = 30

            //MARK: 타이머 루프제거하기
            timer.invalidate()  
            // 중요! 이 라인이 없다면 버튼을 클릭할때마다 타이머가 1개씩 추가됩니다!

            timer = Timer.scheduledTimer(
            timeInterval: 1.0, // 실행 간격
            target: self, // 어디서 실행할 것인지? (VC)
            selector: #selector(timerAction), // 타이머 실행하면 어떤 동작을 할 것인지?
            userInfo: nil, // 타이머에 대한 사용자정보? 타이머 끝날때 까지 강한참조가 걸림
            repeats: true // 타이머를 반복 할 것인가? true라면 timeInterval 초마다 한번씩 반복한다.
        )
    }

    //MARK: 타이머에 설정한 1초마다 반복할 작업 정의
    @objc func timerAction() {
      if remainTime > 0 {
      remainTime -= 1
      infoLabel.text = "\(remainTime)초 남음"
      } else {
        infoLabel.text! = "Done!"
        print(infoLabel.text!)
        timer.invalidate()
      }
  }

}

 

여기서부터 시작 합니다!


1. 뷰 컨트롤러에 타이머와 남은시간 라벨 만들기

infoLabel : 남은시간 라벨

timer : 타이머 초기화

remainTime : 남은시간 초기화(Int)

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var infoLabel: UILabel!
    var timer = Timer() // 1. 타이머 초기화
  	var remainTime: Int = 0 // 2. 남은 시간 초기화

    override func viewDidLoad() {
        super.viewDidLoad()
  }

}

2. 타이머를 실행할 버튼을 만들기.

@IBAction func timerPressed(_ sender: UIButton){
    //MARK: 타이머에 설정할 시간 세팅하기. 여기선 30초로 설정했습니다.
    remainTime = 30

    //MARK: 타이머 루프제거하기
    timer.invalidate()  
    // 중요! 이 라인이 없다면 버튼을 클릭할때마다 타이머가 1개씩 추가됩니다!

	//MARK: 타이머 셋업하기 (타이머 간격, 실행할 메소드 등 스케쥴링)
    timer = Timer.scheduledTimer(
    timeInterval: 1.0, // 실행 간격
    target: self, // 어디서 실행할 것인지? (VC)
    selector: #selector(timerAction), // 타이머 실행하면 어떤 동작을 할 것인지?
    userInfo: nil, // 타이머에 대한 사용자정보? 타이머 끝날때 까지 강한참조가 걸림
    repeats: true // 타이머를 반복 할 것인가? true라면 timeInterval 초마다 한번씩 반복한다.
    )
}

만약 타이머를 셋업하기 전에 들어가야하는 메소드 timer.invalidate()를 뺀다면

버튼을 누를때마다 새로운 타이머가 중복으로 1개씩 더 생성되고 버튼을 다섯번 누르면 5개의 타이머가 돌아갑니다.

 

3. 타이머에 설정한 1초마다 어떤작업을 할 것인지 설정해봅시다.

이제 남은시간을 1초씩 줄이고 남은시간이 0초가 되면 더이상 동작하지 않도록 해야합니다.

// selector가 Objective-C 메소드이므로 
// 함수명 앞에 @objc를 붙여주고 어떤 액션을 할 것인지 설정합니다.

@objc func timerAction() {
    if remainTime > 0 { // 남은시간이 0보다 크다면 아래 내용을 실행합니다.
    remainTime -= 1  // 남은시간을 1초씩 줄여줍니다.
    infoLabel.text = "\(remainTime)초 남음" // 남은시간 라벨을 업데이트합니다.

    } else {
      infoLabel.text! = "Success!" // 남은시간이 0초라면 Success! 를 라벨에 출력하고
      timer.invalidate() // 타이머루프를 해제합니다. 
        // 해제하지 않으면 뷰에는 보이지 않지만 
        // 백그라운드에서 타이머가 계~속 돌아갑니다.
      print("타이머 동작 끝!") // 타이머가 더 이상 반복되지 않는지 확인하는 로그를 출력합니다.
      // 만약 위에서 루프를 해제하지 않으면 이 else 문이 1초마다 무한히 실행됩니다.
    }
  }

 


 

반응형