오늘은 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초마다 무한히 실행됩니다.
}
}
반응형
'개발 > Swift' 카테고리의 다른 글
[Swift] NS Coder로 간단한 Data 저장하기 (Data CRUD - 2) (0) | 2022.07.14 |
---|---|
[Swift] UserDefaults로 간단한 데이터 저장하기 (Data CRUD - 1) (0) | 2022.07.14 |
[Swift] TableView Header 만들기 (0) | 2022.07.06 |
[Swift] 제곱 쉽게 구하기 (pow) (0) | 2022.07.05 |
[Swift] 버튼 누르면 카메라 띄우고 찍은 사진 앱에 반영하기. (UIPickerViewController) (0) | 2022.07.02 |