티스토리 뷰

Mobile/ios

[ios] ios 3: DatePicker & Timer

춘햄 2022. 12. 13. 10:32

DatePicker는 ios가 날짜 선택을 위해 제공하는 라이브러리이다. 

 

DatePicker의 거의 모든 동작에 대한 Action 함수를 제공하고 있고, 거의 모든 아이폰 어플에서 날짜 선택 시 사용하고 있는 아주 사용성이 높은 라이브러리라고 할 수 있다. 

 

우선 간단하게 현재 시간을 초단위로 갱신하며, DatePicker에서 선택한 날짜를 선택 시간 레이블 옆에 표시하는 예제를 작성해보며 익혀보도록 하자.


우선, 아래와 같이 라이브러리 탭을 열어 현재 시간과 선택 시간을 알려줄 레이블을 두개 놓고 DatePicker를 하나 중앙에 놓는다.

DatePicker의 형태는 가장 보편적인 wheel, 그리고 날짜와 시간을 동시에 나타내도록 설정하였다.


이제 각 객체를 @IBOutlet, @IBAction으로 Connect 해주자.

 	
    @IBOutlet var curTime: UILabel!
    @IBOutlet var datePicker: UIDatePicker!
    @IBOutlet var selTime: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    
    @IBAction func changeDate(_ sender: UIDatePicker) {
       
    }

 

현재 시간의 경우에는 1초가 지날 때마다 갱신되어야 하기 때문에 비동기로 계속해서 해당 레이블을 업데이트 해야한다.

 

때문에 swift의 Timer 객체를 사용하여 이를 구현해야 하는데, 이를 위해 Selector 객체를 아래와 같이 생성 한 뒤 Timer.scheduledTimer 메서드를 사용한다.

import UIKit

class ViewController: UIViewController {

    let timeSelector: Selector = #selector(ViewController.updateTime)
    let interval = 1.0
    

    @IBOutlet var curTime: UILabel!
    @IBOutlet var datePicker: UIDatePicker!
    @IBOutlet var selTime: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        Timer.scheduledTimer(timeInterval: interval, target: self, selector: timeSelector, userInfo: nil, repeats: true)
    }
    
    
    @IBAction func changeDate(_ sender: UIDatePicker) {
        // 선택 시간 갱신 코드
    }
    
    @objc func updateTime() {
        // 현재 시간 갱신 코드
    }


}

#selector메서드를 사용하여 Selector 인스턴스를 가져오며, 해당 selector가 실행시킬 Object 메서드를 전달받는다.

 

이 때, selector가 받는 메서드는 반드시 @objc 로 선언이 되어 있어야 한다. (아마 selector의 개념이 Objective C에서 넘어와 순수 swift 함수는 인식하지 못하는 거 같다.

 

이에 대한 자세한 내용은 아래 reference에서 잘 설명하고 있다.

 

selector: https://woozzang.tistory.com/120

 

[Swift] 셀렉터(Selector)란?

1차 수정 : 2021/06/16 2차 수정: 2021/07/05 3차 수정: 2021/07/08 4차 수정: 2022/02/13 안녕하세요🐶 이번 시간에는 셀렉터에 대해 알아보겠습니다. 항상 Objective-C 와 관련된 개념이 나오면 막연히 어려워지

woozzang.tistory.com

 

변수 선언이 끝났으면, viewDidLoad 함수 내에서 Timer.scheduleredTimer 메서드를 interval, selector, repeat 등의 인자를 넣고 돌리면 1초 마다 해당 메서드를 반복적으로 실행하는 비동기 동작이 구현된다.

 

이제 아래와 같이 현재 시간과 선택 시간을 갱신할 코드를 작성해주면 끝이 난다.

//
//  ViewController.swift
//  example_project3
//
//  Created by choonham on 2022/12/12.
//

import UIKit

class ViewController: UIViewController {

    let timeSelector: Selector = #selector(ViewController.updateTime)
    let interval = 1.0
    

    @IBOutlet var curTime: UILabel!
    @IBOutlet var datePicker: UIDatePicker!
    @IBOutlet var selTime: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        Timer.scheduledTimer(timeInterval: interval, target: self, selector: timeSelector, userInfo: nil, repeats: true)
    }
    
    
    @IBAction func changeDate(_ sender: UIDatePicker) {
        let datePickerView = sender
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm EEE"
        
        selTime.text = "선택시간: " + formatter.string(from: datePickerView.date)
    }
    
    @objc func updateTime() {
        let date: Date = NSDate() as Date
        
        let formatter = DateFormatter()
        
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss EEE"
        
        curTime.text = "현재시간: " + formatter.string(from: date)
    }


}


 

위 예제를 좀 더 응용하여, 선택 시간을 알람 시간으로 셋팅하고 해당 시간이 되면 View 의 배경을 1분간 빨간색으로 변경했다 다시 돌아오도록 만들어 봤다.

 

//
//  ViewController.swift
//  example_project3
//
//  Created by choonham on 2022/12/12.
//

import UIKit

class ViewController: UIViewController {

    let timeSelector: Selector = #selector(ViewController.updateTime)
    let interval = 1.0
    
    var alermTime: String = ""
    var count = 0
    var colorToggle = false

    @IBOutlet var curTime: UILabel!
    @IBOutlet var datePicker: UIDatePicker!
    @IBOutlet var selTime: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        Timer.scheduledTimer(timeInterval: interval, target: self, selector: timeSelector, userInfo: nil, repeats: true)
    }
    
    
    @IBAction func changeDate(_ sender: UIDatePicker) {
        let datePickerView = sender
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm"
        
        selTime.text = "선택시간: " + formatter.string(from: datePickerView.date)
        
        alermTime = formatter.string(from: datePickerView.date)
    }
    
    @objc func updateTime() {
        
        let date: Date = NSDate() as Date
        
        let formatter = DateFormatter()
        
        formatter.dateFormat = "yyyy-MM-dd HH:mm"
        
        curTime.text = "현재시간: " + formatter.string(from: date)
        
        if alermTime == formatter.string(from: date) || colorToggle {
            if count <= 60 {
                colorToggle = true
                count += 1
                if !(view.backgroundColor!.isEqual(UIColor.red)) {
                    view.backgroundColor = UIColor.red
                }
            } else {
                colorToggle = false
                count = 0
                view.backgroundColor = UIColor.white
            }
            
        }
        
    }

}

 

 

 

끝!

반응형

'Mobile > ios' 카테고리의 다른 글

[ios] ios 5: Alert  (0) 2022.12.13
[ios] ios 4: Picker View  (0) 2022.12.13
[ios] ios 2: ImageView  (0) 2022.12.12
[ios] ios 1: Hello, Swift!  (0) 2022.12.12
[ios] swift 기본 문법 정리 21: 접근 제어  (0) 2022.12.10
Comments