부스트코스 “iOS 프로그래밍” 요약정리 - 2. 회원가입 화면 구현 #6

Updated:

6. Target-Action




6.1. Target-Action 디자인 패턴이란?

Target-Action 디자인 패턴

  • iOS 환경에서 많이 사용되는 디자인 패턴
  • 객체는 이벤트가 발생할 때 다른 객체에 메시지를 보내는데 필요한 정보를 포함
  • 액션: 특정 이벤트가 발생했을 때 호출할 메서드
  • 타겟: 액션이 호출될 객체, 일반적으로 컨트롤러
  • 직접 타겟 객체에서 메서드를 호출하지 않고 굳이 Target과 Action 지정하고 디자인 패턴 활용하는 이유?
    • 같은 메서드가 여러 클래스에 정의되었거나 인스턴스가 여러개일 수 있다.
    • 이런 상황에서 원하는 객체를 Target으로 지정하면 액션을 실행할 객체를 상황에 따라 선택 할 수 있다.

액션 메서드

  • 액션 메서드는 특정한 양식 필요
  • @IBAction: 인터페이스 빌더가 메서드를 인지할 수 있도록 함
  • @objc: Objective-C 코드 또는 Objective-C 유형의 메서드를 사용하는 경우 필요
    • 아직 애플 프레임워크에 Objective-C 코드가 많기에 스위프트와 호환을 위해 @objc 표시해야함
    • Swift4 이전까지는 컴파일러가 자동으로 처리했지만 Swift4 부터는 명시적으로 작성해야함
// 프로그래밍 방식
@objc func doSomething(_ sender: Any) {

}

// 인터페이스 빌드
@IBAction func doSomething(_ sender: Any) {

}

컨트롤 이벤트

컨트롤 이벤트와 액션과의 관계

  • UIKit에는 UIButton, UIStepper등 UIControl을 상속받은 다양한 컨트롤 클래스가 있다.
  • 컨트롤 객체에 발생한 다양한 이벤트 종류를 특정 액션 메서드에 연결할 수 있다.
  • 컨트롤 객체에서 특정 이벤트가 발생하면 미리 지정해둔 타겟의 액션을 호출한다.

컨트롤 이벤트의 종류

컨트롤 이벤트는 UIControlEvents 타입으로 정의되있다.

  • .touchDown: 컨트롤 터치했을 때
  • .touchDownRepeat: 컨트롤을 연속 터치 할 때
  • .touchDragInside: 컨트롤 범위 내에서 터치한 영역을 드래그 할 때
  • .touchDragOutside: 터치 영역이 컨트롤의 바깥쪽에서 드래그 할 때
  • .touchDragEnter: 터치 영역이 컨트롤의 일정 영역 바깥쪽으로 나갔다가 다시 들어왔을 때
  • 더 많은 내용은 참고 링크…

참고 링크




6.2. Target-Action 디자인 패턴의 활용

  1. 새 프로젝트 MyDatePicker 생성
  2. 스토리보드에 Date Picker, Label 추가
  3. ViewController에 datePicker, dateLabel 프로퍼티, 액션 메서드 추가
  4. 스토리보드와 연결해주고 값 바뀔 때마다 로그 확인
  5. 코드로 액션 메서드 연결 작성 후 확인
  6. ViewController에 dateFormatter 프로퍼티 추가하고 값 바뀔 때마다 dateLabel에 출력하기

DateFormatter

  • 날짜와 텍스트 표현 간의 변환

  • 날짜 형식을 문자열 형식으로 변환

import UIKit

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .full
dateFormatter.timeStyle = .none

let date = Date(timeIntervalSinceReferenceDate: 118800)

// US English Locale (en_US)
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from: date)) // Tuesday, January 2, 2001

// KOR Korean Locale (ko_KR)
dateFormatter.locale = Locale(identifier: "ko_KR")
print(dateFormatter.string(from: date)) // 2001년 1월 2일 화요일
  • 문자열 형식을 날짜 형식으로 변환
import UIKit

let dateFormatter = DateFormatter()

let dateString = "1970-01-01 08:03:30 +0000"
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
print(dateFormatter.date(from: dateString)!) // 1970-01-01 08:03:30 +0000

참고 링크

Leave a comment