아요 개발 일기

[iOS] Date Picker로 알람 맞춰보자!( Timer.ScheduledTimer ) 본문

iOS/뚝딱뚝딱 🛠️

[iOS] Date Picker로 알람 맞춰보자!( Timer.ScheduledTimer )

소진이 2023. 1. 6. 17:32

안녕하세요!

오늘은 저번 글에서 말한것처럼 PickerView를 이용하여 알람을 맞춰보도록 하겠습니다!!

알람을 맞추려면 현재 시간을 출력해야하므로 전에 했던 것보다 조금 더 복잡해요!

같이 해봅시다!!! :D

 

본격적으로 들어가기 전에, 타이머는 Timer.ScheduledTimer라는 클래스 메서드를 사용하여 생성할 수 있어요~

Timer.ScheduledTimer에 대해 알고 싶다면 Apple developer 을 참고해주세요!


시간 출력하려면!!?

먼저 시간을 출력하려면 Timer.ScheduledTimer 사용해야한다고 했는데

아래 코드들을 보면 매개 변수가 5개나 있네요.... 어떤 뜻을 가지고 있는지 알아야 제대로 사용할 수 있겠죠?!

 

Timer.ScheduledTimer 매개 변수 살펴보기

timeInterval : 타이머 실행 간격(초) , Double 타입이며 보통  1.0초로 지정

target : 함수 selector가 호출되어야하는 클래스 인스턴스, 보통은 self 입니다.

selector : 타이머가 실행될 때 호출할 함수, #selector(...)의 형태로 사용합니다.

userInfo : selector에게 제공되는 데이터가 있는 dictionary, 없으면 nil

repeates : 타이머 반복 여부, Bool 타입

 

 


만약 반복 타이머를 중지하고 싶다면 아래 코드를 사용하면 됩니다!!

timer.invalidate()

 


 

Date Picker 설정과 alarmTime 저장하기

 

DatePicker를 사용할때는 날짜, 시간, 분을 어떻게 출력할지 형식(formatter)을 지정해주어야해요.  

 

formatter를 만드는 것은 어렵지 않아요. Swift에서 DataFormatter를 만들어 놓았거든요!!

아래 코드 처럼 그냥 나라, 원하는 출력 형식만 정해주면 잘 나옵니다!!

 

형식은 Unicode.org의 Date Format Patterns 을 참고해주세요 :ㅇ

 

 


 

현재 시간 출력과 저장하기

 

코드를 보면 갑자기 초면인 NSDate()가 들어가있죠? 

잠깐 간단하게 NSDate()에 대해 알아보고 넘어갑시다!!

 

NSDate()가 뭐에요? 

NSDate()는 특정한 시점이며, 기준시(2001년 1월 1일 자정)로부터 경과한 시간의 합을 말합니다.

즉, 기준시로부터 지금 이 순간까지 몇 초나 흘렀나 하는 것을 세어 현재 시간이 언제인지 아는 것입니다!!

NSDate() 객체를 생성하면 기본적으로 생성되는 현재 시점의 정보를 가지게 됩니다.

 

즉, NSDate()를 사용하면 쉽게 현재 시간을 불러 올 수 있어요!!!

 


알람 시간이되면 배경색 변하게 하기

이번에는 알람 시간이 되었을때 배경색을 요란?하게 바꿔볼꺼에요!!

코드를 같이 볼까요?

코드를 보면 count 변수를 이용하고 있어요!

위에 updateTime() 함수가 호출될때마다 count를 하나씩 증가시켰죠?

updateTime() 함수는 Async Task(비동기 함수)이므로 1초에 한번씩 구동됩니다!! 

그러므로 count는 1초에 하나씩 증가하겠죠?

즉, 배경 색은 짝수 초일때 빨강으로 홀수 초 일때는 파랑으로 변경됩니다ㅎㅎ

 

 

구현 화면과 전체 코드 올려놓겠습니다!

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var lblCurrentTime: UILabel! // 현재 시간 출력 라벨
    @IBOutlet weak var lblPickerTime: UILabel! // 선택 시간 출력 라벨
    
    let interval = 1.0 // 몇 초 간격?
    let timeSelector: Selector = #selector(ViewController.updateTime) // selector 변수로 간단하게 선언해놓기
    var alarmTime: String? // 선택시간 저장할 변수
    var count = 0 // 배경 변경할때 사용할 변수
    
    override func viewDidLoad() {
        super.viewDidLoad()
       //  1초 간격으로 self 내의 timeSelector 함수가 호출 되며 계속 반복 되는 타이머
        Timer.scheduledTimer(timeInterval: interval, target: self, selector: timeSelector, userInfo: nil, repeats: true)
    }

    @IBAction func changeDatePicker(_ sender: UIDatePicker) {
        let datePickerView = sender
        let formatter = DateFormatter() // 특정 포맷으로 날짜를 보여주기 위한 변수 선언
        
        formatter.locale = Locale(identifier: "ko")
        formatter.dateFormat = "yyyy-MM-dd EEE a hh:mm" // 날짜 포맷 지정
        lblPickerTime.text = "선택 시간 : \(formatter.string(from: datePickerView.date))" //label에 선택 시간을 출력
        
        
        formatter.dateFormat = "a hh:mm" //알람에 시,분만 사용하므로 새롭게 포맷 지정
        alarmTime = formatter.string(from: datePickerView.date) // alarmTime 변수에 사용자가 선택한 시간을 저장
    }
    
    // Async Task로 1초당 1번씩 구동
    @objc func updateTime(){
        count += 1
        
        let date = NSDate() // 현재 시간을 알기 위해
        let formatter = DateFormatter() // formatter 설정하기위해
        
        formatter.locale = Locale(identifier: "ko") // 지역 설정
        formatter.dateFormat = "yyyy-MM-dd EEE a hh:mm:ss" // 포맷 설정
        lblCurrentTime.text = "현재 시간 : \(formatter.string(from: date as Date))" // 기준시 2001년 1월 1일 자정으로부터 경과한 시간과 비교하여 현재 시간의 정보를 가짐
        
        formatter.dateFormat = "a hh:mm" // 알람 울릴때만 사용할 형식
        let currentTime = formatter.string(from: date as Date) // 현재시간을 currentTime 변수에 저장 (비교 위해)
        
        // 알람 시간과 현재 시간이 같으면 실행할 부분
        if alarmTime == currentTime{
            if count % 2 == 0{ // 짝수 초 일때
                view.backgroundColor=UIColor.red
            }else{ // 홀수 초 일때
                view.backgroundColor=UIColor.blue
            }
        }else{ // 알람 시간이 아닐때
            view.backgroundColor = UIColor.white
        }
    }
    
}// ViewController

 

 

 


 Alert 띄우기

먼저 Alert이 어떻게 생겼는지 모르는 분들이 있을 수 있으니..!!

Alsert 사진을 데려 왔습니다!!!

 

alertFlag는 알람 시간일 때 alert을 띄우기위해 만들어 놓은 Bool 변수에요!! 

다른 부분은 다 동일합니당!! :o

 

아래는 코드와 구현 영상이에요!!

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var lblCurrentTime: UILabel!
    @IBOutlet weak var lblAlarmTime: UILabel!
    
    let interval = 1.0
    let timeSelector: Selector = #selector(ViewController.updateTime)
    var alarmTime: String?
    var alertFlag = false // alert 띄워진 후 확인 눌렀는지 확인 할 변수
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        Timer.scheduledTimer(timeInterval: interval, target: self, selector: timeSelector, userInfo: nil, repeats: true)
    }

    @IBAction func pickerTime(_ sender: UIDatePicker) {
        let datePickerView = sender
        let formatter = DateFormatter()
        
        formatter.locale = Locale(identifier: "ko")
        formatter.dateFormat = "yyyy-MM-dd EEE a hh:mm"
        lblAlarmTime.text = "선택시간 :" + formatter.string(from: datePickerView.date)
        
        formatter.dateFormat = "a hh:mm"
        alarmTime = formatter.string(from: datePickerView.date)

    }
    
    @objc func updateTime(){
        let date = NSDate()
        let formatter = DateFormatter()
        
        formatter.locale = Locale(identifier: "ko")
        formatter.dateFormat = "yyyy-MM-dd EEE a hh:mm:ss"
        lblCurrentTime.text = "현재시간 :" + formatter.string(from: date as Date)
        
        formatter.dateFormat = "a hh:mm"
        let currentTime = formatter.string(from: date as Date)
        
        if alarmTime == currentTime {
            if !alertFlag{
                // alert 설정
                let alaramAlert = UIAlertController(title: "알림", message: "설정된 시간 입니다!!!", preferredStyle: .alert)
                let onAction = UIAlertAction(title: "네, 알겠습니다.", style: .default, handler: nil)
                
                alaramAlert.addAction(onAction) // 액션 추가
                present(alaramAlert, animated: true, completion: nil) // alert 실행
                alertFlag = true
            }
        }else{
            alertFlag = false
        }
        
    }
    
    
}