스톱 워치 만들기 (1) : https://wiwi-pe.tistory.com/34

스톱워치 만들기 (2) : https://wiwi-pe.tistory.com/35

스톱워치 만들기 (3) : https://wiwi-pe.tistory.com/36

스톱워치 만들기 (4) : https://wiwi-pe.tistory.com/37

스톱워치 만들기 (5) : https://wiwi-pe.tistory.com/38

스톱워치 만들기 (6) : https://wiwi-pe.tistory.com/39

 

iOS 개발 튜토리얼1 - 스톱워치 만들기 (6) 스토리보드와 코드 연결하기,함수만들기, 코드로 버튼과 함수 연결하기

스톱 워치 만들기 (1) : https://wiwi-pe.tistory.com/34 스톱워치 만들기 (2) : https://wiwi-pe.tistory.com/35 스톱워치 만들기 (3) : https://wiwi-pe.tistory.com/36 스톱워치 만들기 (4) : https://wiwi-pe...

wiwi-pe.tistory.com

 

 

 

저번편에서 버튼에서 하나 잊은게있었습니다.

 

isEnabled 속성입니다.

 

어제 소스 그대로 시뮬레이터로 돌려보면 버튼중에 startButton을 누르면 콘솔에 10이 뜨고

그외에는 UI적으로 눌렀다는 표시만 나올겁니다.

이 눌렀다는 표현이 나온다는거 자체를 막아야할때가있습니다.

 

그때 쓰는게 바로 isEnabled 속성입니다. 기본은 true로 당연히 모든버튼이 누를수있도록 되어있습니다.

애플문서의 설명은 저번 포스트에서 있을거에요 넘어가겠습니다.

 

스톱워치라하면 startButton을 누르기전까진 랩타임이 기록되면 안되고 스톱버튼도 동작이 무의미하겠죠?

 

오히려 스톱버튼이 불필요한 동작으로인해 다른 문제가 발생할여지도 있습니다.

 

그래서 startButton을 눌러 시작상태가 될때만 이 둘이 동작가능하도록 하겠습니다.

 

우선은 checkButton만 해보죠

 

저번 소스의  viewDIdLoad함수안에 있는 

 

startButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

소스 바로 아래라인에 추가해주세요

 

checkButton.isEnabled = false

 

이제 시뮬레이터로 실행을 시켜보면

 

위 그림처럼 Check 버튼자체가 눌려지지 않게됩니다

 

추가로 stop버튼도 

 

이제 다른 버튼에 대해 기능을 달아주기전에 enum 변수에대해 조금 알아보고갑시다

 

열거형 변수라고 부르는 enum은 

단순히 여러개의 종류를 한묶음으로 묶어줄때 사용합니다.

 

형태는 아래와 같습니다

 

enum 이름 {

    case 첫번째항목

    case 두번째항목

}

 

예시로 하나 들자면

 

enum Icecream {

    case vanilla

    case strawberry

    case cherry

    case chocolate

}

이렇게 아이스크림 종류가 있겠네요.

 

사실 굳이 이걸 안써도 되지만

 

 

swift에서는 이 enum과의 switch의 상성이 매우 좋습니다.

 

위의 아이스크림을 아래와같이 할 수 있어요

 

var selectIce:Icecream 

이렇게 Icecream이라는 enum형식을 가진 selectIce라는 변수가 있다면

 

switch selectIce {

    case .vanilla :

        print("바닐라를 선택하셨습니다.")

    case .strawbrerry :

        print("딸기를 선택하셨습니다.")

    case .cherry :

        print("체리를 선택하셨습니다.")

    case .chocolate :

        print("초콜릿을 선택하셨습니다.")

}

 

이런식으로 모든 switch에서 나올수 있는 항목을 enum으로 지정한 항목만 가능하도록 할 수 있습니다.

물론 다른언어처럼 중간에 선택할 필요없는 항목은 default 라는걸로 생략 할 수 있어요

이번 튜토리얼에서 버튼들의 기능을 하나의 함수로 묶는다고 했는데

바로 이때 쓸겁니다.

버튼 종류를 한정시켜놓고(enum) switch문으로 나눌꺼에요

 

MainVC 클래스 내부 상단에 아래와같이 정의해줍시다

 

    enum ButtonTag:Int {

        case start = 10

        case check = 20

        case stop = 30

        case reset = 40

    }

  

갑자기 각 case에 값이 달렸네요!

네 스위프트에서는 enum의 가능성은 무한한합니다!

 

공부해 나가다보면 함수도 달고 이것저것 달고 마치 하나의 클래스를 지정하듯한 모습을 보실수 있을겁니다만

튜토리얼에서는, 그리고 제가 짜는 코드에서는 값이 달리는것 외에는 없겠네요.

 

아직도 주니어 개발자이고 여태 해본 프로젝트에서는 더이상의 기능은 필요가 없었어요.

 

값을 지정해주려면 enum의 이름 옆에 타입을 적어주고

각 case 에 그 타입에 맞는 값을 넣어주시면 됩니다.

 

추가로 enum에 값을 넣어주시면 그 값에 해당하는 내용이 있는지 검사해볼수 있습니다

 

enum의 이름을 적어서 생성자같이 해주면됩니다!

ButtonTag(rawValue: 찾는값) 이라고 해주면 옵셔녈 변수로 값을반환해줍니다.

 

또 다른 언어에는 없는 변수가 나왔네요.

옵셔녈 변수는 

선언할때는 변수타입뒤에 '?'를 붙여서 선언해줍니다

이는 값이 있을수도 있고 없을수도 있어! 라고 해주는건데

하나의 변수에 값에 대한 지정을 없다 or 값 으로 해줄 수 있어 좀더 안정적인 프로그래밍이 가능해도록 해주는 녀석입니다

이 옵셔널이라는건 일종의 포장입니다 

(원래값을 가진 변수) 를 (옵셔널(원래값을 가진 변수)) 이 되어 

옵셔널을 풀어줘야만 원래값을 볼 수 있습니다

이 원래값을 가진 변수 부분에 사실 값이 없을 수 있을경우( null값, swift에서는 nil이라 부릅니다)

이 옵셔녈을 바로 풀어주면 nil이 나오게 됩니다.

 

옵셔녈을 풀어주는 방법은 여러가지 있는데 여기서 두가지만 소개하자면

b라는 옵셔널 변수가 있다면 이를 사용하기 위해선 

첫번째

if안에서 변수를 선언해서 사용가능합니다.

if let a = b {

    내부에서만 사용가능

}

if의 조건문 자리에 b를 할당하는 변수를 선언하게되면 이 b가 할당가능하면( 옵셔널내부에 값이 존재하면) a라는 변수에  b가 가진 원래값을 넣고 아니라면 else로 빠져나가게 되는 조건문이되겠습니다 

 

두번째

b가 nil일때 대신할 값을 지정 

let a = b ?? c

 옵셔널값의뒤에 물음표 두개를 붙이면

b가 nil일때 c를 a에 대신넣는다 라는게 됩니다.

 

물론 c와 b의 원래값의 타입은 같아야합니다.

 

옵셔널에대한 더 자세한 설명은

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

링크에서

Optionals

항목을 찾아 읽어주세요!

 

그리고 enum은

https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html

링크에 더 자세한 설명이 되어있습니다

 

 

 

그럼 잠시 enum은 멈춰두고

 

함수에대해서 이야기 할겁니다.

 

이 튜토리얼의 대상이라면 이미 다른 언어나 혹은 같은 언어로 이미 함수에대해 많이 알고 계실거라 생각됩니다.

 

파이썬이라면

def 함수이름() :

  함수내용

 

자바라면

void 함수이름() {

}

 

그리고 스위프트는(4 이상)

 

func 함수이름() {

}

입니다만 저번편을따라해보신분은 이미 buttonAction함수를 생성하셨을것이고

거기에서 살짝 이야기를 했습니다.

 

좀더 자세히 보자면 함수 형태는 아래와같습니다.

접두사 func 함수이름(파라미터 닉네임 받는 파라미터 : 파라미터 타입) -> 반환타입 {

}

저번포트스에서

@objc func buttonAction(_ sender:UIButotn) {

}

이라고 함수를 하나 만들었는데

@objc가 바로 접두사 쪽( 본래 명칭이 아닐 수 있습니다..;;)

그리고 함수를 뜻하는 func

함수이름은 buttonAction

파라미터는 , 로 구분하는데 하나만 있고

이 파라미터의 닉네임은 _ 로 생략한다.

파라미터명은 sender 이고

파라미터의 타입은 UIButton이다

 

이함수의 반환형은 Void로 없다 없을 경우 저렇게 파라미터위치 옆을 비워둘수있습니다.

 

사실 buttonAction은 이런거죠

    @objc func buttonAction(_ sender:UIButton) -> Void {

        print(sender.tag)

    }

 

 

 

만들 함수는 이전 포스트에서는 버튼에대한 내용을 하나하나

viewDidLoad 함수에서 해줬는데 이에대한 중복을 조금 줄일겁니다.

 

아래와같이 MainVC클래스 내부에 만들어주세요!

 

    func setButton(button:UIButton, tag:ButtonTag){

        button.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside)

        button.tag = tag.rawValue

    }

 

이 setButton이라는 함수는 UIButton과 ButtonTag라는 enum형식 변수를 받아 받은 버튼에대한 속성을 지정해주는 함수입니다

이전

        startButton.tag = 10

        startButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

를 함수로 만들어준거에요

라인 순서만좀 달라졌네요

이제 이 만든 함수를 이용해 버튼들을 완성시켜봅시다

 

viewDidLoad()함수에서 이전에 지정해준 startButton에 대한 내용을 지우고 아래와같이 완성시켜주세요

 

    override func viewDidLoad() {

        super.viewDidLoad()

        setButton(button: startButton, tag: .start)

        setButton(button: checkButton, tag: .check)

        setButton(button: stopButton, tag: .stop)

        setButton(button: resetButton, tag: .reset)
        checkButton.isEnabled = false

    }

 

현재로서는 viewDidLoad함수는 위와같아야합니다

이러게하면 이제 모든 버튼이 buttonAction함수와 연결이 된겁니다.

 

이제 buttonAction함수를 좀 채워줄꺼에요

이전 Print를 적어준건 지우고 아래와같이 작성해줍시다.

    @objc func buttonAction(_ button:UIButton) {

        if let select = ButtonTag(rawValue: button.tag) {

            switch select {

            case .start: startAction()

            case .check: checkAction()

            case .reset: resetAction()

            case .stop : stopAction()

            }

        } else {

            print("존재하지않는 태그를 가진 버튼의 입력이 들어왔습니다.")

        }

    }

 

 

if let select는 위에서 설명했던데로 ButtonTag(rawValue:)의 반환값이 옵셔녈이라 사용해주기위해 쓴겁니다

그리고 내부는 start, check, rest,stop버튼 항목이 각각 연결해준 함수들이있습니다

 

이 함수들은 아직 안만들어줘서 xcode에서 빨간 줄이 그어질겁니다

 

 

이제 이 존재하지않다고 빨간줄 뜨는 함수들을 다 만들어줄꺼에요

MainVC내부에 아래와같이 추가해줍시다

    
    func startAction() {
        print("start")
        startButton.isEnabled = false
        checkButton.isEnabled = true
        stopButton.isEnabled = true
    }
    
    func checkAction() {
        print("check")
    }
    
    func stopAction() {
        print("stop")
        startButton.isEnabled = true
        checkButton.isEnabled = false
        stopButton.isEnabled = false
    }
    
    func resetAction() {
        print("reset")
        startButton.isEnabled = true
        checkButton.isEnabled = false
        stopButton.isEnabled = true
    }

각버튼이 눌리면 무슨버튼인지 콘솔에 출력해줄것이고

 

startAction이 실행되면

기존에 작동을 안하게 해뒀던 check와 앞으로 stop 상태에 들어가면 중지시킬 stop 버튼을 동작하게 해주고

계속해서 startButton이 안눌리도록 startButton의 isEnabled를 false로 설정해줍니다

 

 쭉쭉 이런식으로

stop과 start. 거의 토글식으로 

reset은 전부 처음으로 돌려주고 하는식으로 해줄꺼에요

 

그럼 이제 돌려봅시다

 

 

잘 동작하네요!

 

그럼 다음편에서는 시간이 흐르도록 해봅시다

스톱 워치 만들기 (1) : https://wiwi-pe.tistory.com/34

스톱워치 만들기 (2) : https://wiwi-pe.tistory.com/35

스톱워치 만들기 (3) : https://wiwi-pe.tistory.com/36

스톱워치 만들기 (4) : https://wiwi-pe.tistory.com/37

스톱워치 만들기 (5) : https://wiwi-pe.tistory.com/38

 

iOS 개발 튜토리얼1 - 스톱워치 만들기 (5) Constant수정, 다크모드 전환

스톱 워치 만들기 (1) : https://wiwi-pe.tistory.com/34 스톱워치 만들기 (2) : https://wiwi-pe.tistory.com/35 스톱워치 만들기 (3) : https://wiwi-pe.tistory.com/36 스톱워치 만들기 (4) : https://wiwi-pe...

wiwi-pe.tistory.com

 

스톱워치 만들기 5까지 끝내셨다면 이제 스토리보드에 오브젝트를 추가할일은 없습니다

이번편부터 주로 다룰 부분은 텍스트창 입니다 확장자가 .swift 로 되는 파일들에 적어넣어갈꺼에요

 

우선 파일 이름이 마음에 안들어서 하나 삭제하고 다시 만들겁니다.

프로젝트 네비게이션에서 ViewController.swift 파일을 선택하고 키보드의 Delete키를 눌르신후 휴지통으로 버려주세요

위 사진의 선택된 부분을 삭제하시면됩니다.

그후 프로젝트 네비게이터의 Tutorial1 라 적힌 폴더에서 마우스 우클릭(옵션메뉴)을 한후 New File을 선택해줍니다

 

아래 사진의 iOS 의 Cocoa Touch Class( 소스 템플릿입니다)를 선택하신후 다음을눌러주세요

 

Class이름을 MainVC라 적을겁니다.

그리고 다음을 누르고 생성을 누르시면됩니다

 

 

굳이 원래있던 ViewController.swift 를 삭제하고 같은 역할을하는 클래스를 생성해준이유는 

그냥 제 스타일입니다 ㅎ 

그냥 원래 있던 ViewController.swift에서 앞으로할 작업을 하셔도 상관없어요

저는 스토리보드이름과 vc(viewcontroller)파일이름을 맞춰주는걸 좋아해서 이렇게 했습니다

저와같이 생성하셨으면

프로젝트 네비게이터가 아래사진과같이 되시면됩니다

 

 

다시 Main.storyboard로 돌아가서

아래 사진의 화면의 아이폰화면 상단에 있는 검은색바를 선택해주세요

 

그후 인스펙터즈 화면에서  네번째 아이콘 아이덴티티 익스펙터화면으로간후

Custom Class가 아래화면처럼 ViewController로 되어있을겁니다 

이는 처음 자동생성되면서 방금 지운 ViewController.swift에 만들어져있는 ViewContoller클래스이름이 자동으로 넣어져있는겁니다

이 Class를 아래와같이 변경해주세요. 방금 만든 MainVC를 적으시면됩니다

 

변경이 잘됐으면 스토리보드의 좌측영역 스트럭쳐에리어 부분이 ViewController Scene에서 MainVC Scene으로 변경되었을겁니다

 

 

다룰 클래스도 바꾸었습니다

이제 스토리보드영역의 상단바의 가장 오른쪽 버튼(Add editor on Right 라 설명이 나오는 버튼)을 눌러 에디터화면을 늘려줍니다 아래 사진의 하얀색 점선으로 그린 사각형 영역입니다 

 

 

이버튼을 누르면 화면이 아래와같이 되었을겁니다

추가된 화면의 상단바의 Main.storyboard라고 적힌 부분을 클릭한후 MainVC를 눌러주세요

각 에디터는 이런식으로 변경해줄수도 있고

프로젝트 네비게이터에서 드래그앤드롭으로 변경해줄수도 잇습니다. 아니면 바꿀에디터화면을 한번 선택한 상태에서 프로젝트 네비게이터에서 열 파일을 선택하시면됩니다.

 

여러방법으로 추가한 에디터화면이 아래 사진과 같이 되었으면됩니다 

위 사진과같이 여셨다면 아래 영상과같이 소스코드에 각 오브젝트들을 연결해주세요

 

 

영상에는 안나왔습니다만 스토리보드에서 아이템을 소스로 연결시킬때는 컨트롤키를 누른상태에서 드래그엔 드롭 해주시면됩니다

 

 

각 소스에 붙은 @IBOutlet 은

@IB는

 Interface Builder Annotation 의 IB와 A를 @로 한거라하는데 자세한 설명이 안보이네요 .

저도 독학으로 공부한거라 미흡한 부분이 많으니 부디 이 튜토리얼을 따라하시는분들은 따로 검색해보시기바랍니다.

스토리보드에서 바로 코드로 연결하는 변수들은 두가지 정도의 종류가 있습니다 

@IBOutlet( 앞으로는 아울렛변수라 부르겠습니다)

@IBAction 

 

아울렛 변수는 그 해당하는 아이템의 속성을 변경해주기위해 지정하는것이고

IBAction은 화면에서는 안나왔지만 버튼과같은 컨트롤오브젝트들의 동작을 바로 함수로 연결해줄때 함수앞에 붙는 이름입니다.

 

아울렛변수로 지정하는것은 스토리보드에서 어트리뷰트 인스펙터보다 더 다양하고 또 프로그램의 흐름에따라 변경이 가능하게할 수 있기에

많이 사용하게 될겁니다.

 

물론 이들은 스토리보드와 같이 개발할때 사용합니다 ㅎ

 

 

 

 

오늘은 버튼하나에 대해서는 다루다 끝을 맺겠습니다

자동으로 생성된 소스에는 

 

override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view.

  }

라는 부분이 있습니다.

 

친절하게도 저렇게 주석이 달려있어서 무슨 역할을 하는 함수인지 알아볼수 있어요

view에 대해 아직 익숙하지 않을시점이지만 무엇인지는 짐작이 가실테고 제목에서부터 view가 로드된후 라는이름을 가진 함수라

쉽게 짐작하실겁니다.

 

이 함수는 뷰가 전부다 생성이 된후에 이 클래스가 처음 실행될때  단 한번만 실행이 되는 함수입니다 원래 setup이라는게 보통 한번만 해주잖아요? ㅎ 

 

단 한번만이라는게 중요한데

이 Viewcontroller라는게 여러 주요 돌아가는 함수들이 있습니다.

이에대해 궁굼하신분은 추가적으로 iOS ViewController Life Cycle 라고 검색하시면 더 자세히 알 수 있습니다

 

아무튼 다시 원래 이야기로 돌아가서 이번 포스트에서는 버튼에 대한걸 하나만 이 viewDidLoad함수에다가 설정해주고 끝낼겁니다

 

이 버튼은 UIButton 이라는 클래스입니다

이 클래스는 UIControl이라는 클래스를 상속받은 클래스이고

UIControl은 UIView라는 클래스를 상속받은 클래스입니다.

 

결국다! UI라 붙은 클래스들은 그 상위가 UIView의 민족이라는 놀라운 이야기.........

는 집어치우고 

 

상속받은 클래스들 이름을 보면 알수 있듯이 이 UIButton은 View가 있고 Control을 할 수 있는 클래스입니다.

이 뷰쪽은 스토리보드에서 설정을 끝마쳤으니 저희가 할 부분은 Control부분의 설정입니다,.

 

UIButton에서 사용할 속성과 함수들은( 애플에서의 설명들...)

 

. 애플 도큐먼트 페이지를 보시면 더 많은 정보를 얻으실 수 있으십니다.

 

 

 

 

우선 UIView에 정의되어있는 태그

tag

An integer that you can use to identify view objects in your application.

Declaration

var tag: Int { get set }

Discussion

The default value is 0. You can set the value of this tag and use that value to identify the view later.

 

 

 

 

 

 

UIControl에 정의되어있는 addTarget

addTarget(_:action:for:)

Associates a target object and action method with the control.

Declaration

func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event)

 

 

 

 

 

UIControl에 정의되어있는 isEnabled

isEnabled

A Boolean value indicating whether the control is enabled.

Declaration

var isEnabled: Bool { get set }

Discussion

Set the value of this property to true to enable the control or false to disable it. An enabled control is capable of responding to user interactions, whereas a disabled control ignores touch events and may draw itself differently. Setting this property to false adds the disabled flag to the control’s state bitmask; enabling the control again removes that flag.

The default value of this property is true for a newly created control. You can set a control’s initial enabled state in your storyboard file.

 

 

UIButton에 대해 설정할 수 있는데 엄청 많지만

이렇게 버튼은 세개만 다룰겁니다.

 

 

우선 startButton에 tag를 지정할겁니다

태그는 일종의 이름으로서 클래스내부에서 startButton이라는 버튼의 주민등록번호같은 역할을합니다

이렇게 태그를 넣어주는이유는 MainVC라는 클래스에서 사용되는 버튼들이 눌려졌을때에대한 동작을 하나의 함수로 몰아주려고하는데

이따 하나의 함수에서 여러개의 버튼을 구분하기위한 방법중하나입니다.

물론 이 버튼에 쓰여있는(버튼 라벨)글이나 여러가지방법으로 구분이 가능할수도 있겟습니다만

저는 태그를 통해 하려고해요

 

소스를 다음과같이 수정해줍시다

 

viewDidLoad()의 주석을 지우고 그자리에 

startButton.tag = 10

을 넣어주세요. ( Tag의 설명에 있듯이 태그값은 정수만 가능합니다 )

 

override func viewDidLoad() {

    super.viewDidLoad()

    startButton.tag = 10

}

 

태그는 지정해주었고 이제 startButton이 눌러졌을때의 기능을 만들겁니다

 

viewDidLoad() 함수가 끝나는 '}' 다음에 

다음과같이 적어주세요

 

@objc func buttonAction(_ sender:UIButton) {

    print(sender.tag)

}

 

@objc 라는의미는 스위프트 이전에 iOS앱만드는데 사용했던언어인 objective C에서 사용된 라이브러리

혹은 각종 클래스에서 사용할 수 있게 만드는 마법의 키워드입니다

 

이 키워드로 인해 swift와 objective c는 좋은 사이를 유지하면서 발전가능해집니다

 

위에서 스토리보드의 오브젝트들과 코드를 연결해주면서 자동으로 연결되었던 라인들을 보시면 짐작하시겠지만

스위프트4에서는 기본적으로 

상수or변수  이름:타입 = 값

형태로 변수를 선언합니다

이 형태는 함수의 파라미터에서도 그대로 사용됩니다.

buttonAction이라는 함수는 sender라는 이름의 파라미터를 가지고있는데

이는 변하지않는 상수 형태이며 UIButton이라는 타입인 파라미터라고 쓴겁니다.

 

sender 앞에 ' _ ' 라고 적은것은

외부에서 함수를 부를때 buttonAction( 값 ) 형태로, 파라미터이름을 표시하기 싫을때 _ 라고 표시합니다.

 

이를 _ 대신 다른, 예를 들어 A라 적었으면 buttonAction(A: 값) 형태로 호출을 해야합니다.

외부에서 보여지는 파라미터의 닉네임을 정해줄수 있는거에요

 

buttonAction은 꼭 파라미터를 _ sender:UIButton 으로 줘주세요 ( 여기 프로젝트에서 한정입니다 ^^) 

 

다른 언어 특히 파이썬을 해보신분은 buttonAction함수안에 있는 내용이 상당히 익숙할건데

이는 sender라는 버튼의 태그값을 콘솔에 출력해주세요 라는 명령입니다.

 

 

 

이제 startButton에 묶을 함수까지 만들었으니

startButton에 함수를 연결해줘야합니다.

 

startButton.tag = 10 라인 밑에

 

startButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

라고 적어줍시다

 

addTarget은 

 

위에 애플설명처럼 

 

타겟 오브젝트와 액션메소드(함수)를 연결시켜주는 UIControl에 정의되어있는 함수입니다 

원형은 

 

func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event)

인데  타겟 파라미터 앞에 _ 가 붙어있죠?

그래서 startButton에 addTarget의 가장첫파라미터는 target: 값 이라 적지않고

바로 self라는 값을 넣어준겁니다. 

 

이 타겟의 파라미터에 대한 설명을 애플은 아래와같이 문서에 적어놨습니다.

target
The target object—that is, the object whose action method is called. If you specify nil, UIKit searches the responder chain for an object that responds to the specified action message and delivers the message to that object.

 

요약해 호출되는 객체를 지정하는 것이라는데 저는 아직 self 밖에 해보질않아 다른것을 지정해줄때도 있는것인지 모르겠습니다!

혹시 이글을 보시는분들중에 아시는분계시다면 꼭 공유해주셨으면 좋겠네요 

 

그렇게 다음 action은 지정해줄 함수를 말하는데

#selector가 objective c로 만들어진것인지 

액션메소드가 꼭 @objc가 붙어야 인식이됩니다.

그다음은 for 라는 파라미터는 버튼의 상태, 어떤 이벤트가 발생했을때 이 액션메소드(buttonAction)가 실행되는가인데

 

다른 UIControl를 상속하는 오브젝트들의 이벤트까지 같이 들어있기에 꽤 많이 있습니다

우리는 이 많은 이벤트중에 

 

static var touchUpInside: UIControl.Event

A touch-up event in the control where the finger is inside the bounds of the control.

 

를 사용할겁니다

말그대로 버튼을 누른후 그장소에서 손을땠을때 라는이벤트입니다

 

이번에 지정해준 addTarget의 내용을 정리하자면

영어이니 뒤에서부터 해석하자면

버튼을 눌렀다가 그 장소에서 땟을때 buttonAction를 함수를 실행시키는데 이에대한 호출자가 startButton이다 라는 의미입니다.

 

그렇게 

 

class MainVC:UIViewController {} 의 총 소스는

아래와같습니다.

 

import UIKit

class MainVC: UIViewController {
    
    @IBOutlet weak var lapTableView: UITableView!
    
    @IBOutlet weak var timeLabel: UILabel!
    @IBOutlet weak var decimalLabel: UILabel!
    
    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var checkButton: UIButton!
    @IBOutlet weak var stopButton: UIButton!
    @IBOutlet weak var resetButton: UIButton!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        startButton.tag = 10
        startButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    }
    
    @objc func buttonAction(_ sender:UIButton) {
        print(sender.tag)
    }
}

 

이를 시뮬레이터, 아이폰11에서 실행하면 

아래영상과같이 나온다면 성공입니다!

 

 

그럼 다음 포스트에서 봐요~

+ Recent posts