밤에 쓴 코드

iOS) IBOutlet / IBAction 본문

iOS

iOS) IBOutlet / IBAction

붱이🦉 2019. 7. 23. 22:47
  • Outlet

    • Outlet은 하나의 오브젝트에서 다른 오브젝트의 참조를 가지는 프로퍼티이다.
    • reference는 인터페이스빌더를 통해 기록된다.
    • Outlet들과 포함하는 오브젝트간의 연결은 nib 파일로 부터 unarchived(기록저장 용도로 쓰다가 실제로 앱에서 사용될 때 ) 될 때마다 재정립된다
    • 포함하고 있는 오브젝트는 OutletIBOutlet이라는 타입한정자와 함께 약한참조의 형태(weak)로 가지고 있다.
    • Outlet은 오브젝트의 캡슐화된 데이터의 일부기때문에 프로퍼티의 형태로 있어야한다.
    • 오브젝트Outlet의 연결은 nib파일에 기록된다.
    • nib파일이 로드될 때, unarchived 되고, 이 관계는 재정립된다.
    • @IBOutlet이라는 태그가 정의부에 적용된다. 왜냐하면 인터페이스 빌더가 이 프로퍼티를 Outlet으로서 인식을 하기 위해서이다.
    • controller오브젝트인터페이스오브젝트간의 연결이 일반적이다. 하지만 인터페이스빌더의 인스턴스로서 보여질 수있는 오브젝트라면 연결이 어떤 오브젝트라도 가능하다.
    • 오브젝트가 가지는 Outlet이 많으면 많을 수 록 메모리를 많이 필요로 한다. 인덱스로 참조하거나, 함수의 인자로 받는 형태로 대체 가능하다.
    • Outlet 은 결국 오브젝트간의 하나의 합성의 형태이다. 하나의 객체에서 다른 객체에게 메시지를 보내기위해서 참조를 얻어오기 위해 요구되는 동적패턴이다.
  • Action

    • 액션은 하나의 컨트롤이 타겟에게 보내는 메시지 이다.

    • 시스템에게 의도를 전달하기 위해서 Control을 사용한다.

    • Control을 통해서 하드웨어에서 발생한 이벤트 자체는 의도를 내포하기 어렵다, 그래서 이벤트와 명령간의 변환에는 일종의 메커니즘이 필요하다.target-action이라고 불리는

    • Appkit 에서는 액션을 SEL타입의 인스턴스 변수로 저장한다.

    • action메소드sender(액션메시지를 보내는 컨트롤)라는 Id타입의 단일 파라미터를 받으며, 반환은 따로 하지 않는다.

    • UIkit에서의 이벤트는 사람의 손가락에서 시작되고, 이것은 멀티 터치또한 처리해야한다.

    • Target 과 action을 하나 이상의 제어 이벤트와 연결하여 대상 개체에 작업 메시지를 보내도록 컨트롤을 설정합니다

    • 특정 지정된 방식으로 컨트롤을 터치하게되면, 컨트롤은 액션메시지 (sendAction:to:from:forEvent:)를 UIApplication에게 보낸다.

    • 만약 액션메시지의 타겟이 nil이라면 액션메시지를 처리할 때 까지 체이닝을 통해 응답을 할 수 있는 객체를 찾는다.

      • UIKit에서의 메시지형태

      • •    - (void)action
        •    - (void)action:(id)sender
        •    - (void)action:(id)sender forEvent:(UIEvent *)event
  • Target

  • 타겟은 액션메시지의 리시버이다.
    Control은 액션메시지에 타겟을 Outlet의 형태로 가지고있다.
    만약 action 의 타겟이 nil 이라도 아래의 절차에 따라 응답할 객체를 찾는다.
    1. 메시지처리를 위한 검색은 keyWindow를 첫번째로 window의 contentView로 연쇄된다.
    2. window와 window의 delegate를 시도한다.
    3. mainWIndow와 keyWindow가 다르다면 mainWindow로 다시 검색을 시작합니다.
    4. 오브젝트가 한번 시도를 하고 응답하지 못한다면, delegate에게 요청한다.
  • Control

  • Control
    컨트롤은 사용자의 의도를 시스템에 반영한다.
    컨트롤은 사용자의 명령을 수행할 오브젝트에게 전달한다
    
    사용자가 컨트롤에서 어떤 작업을 했을 때, 하드웨어에는 이벤트를 발생시킨다.
    이벤트는 타겟에게 액션메시지로 전달되고, 명령이 실행된다.
    
    UIKit에서의 컨트롤들은 UIControl(iOS의 target-action 메커니즘의 대부분이 정의된 )의 자식클래스이다.
    
    

 

  • Step3 - 실행영상

ezgif com-resize

하나의 버튼에는 여러개의 이벤트를 전달할 액션 메소드를 연결할 수 있고,

그 액션메소드는 여러개의 컨트롤(UIControl 을 구현한 인스턴스) 들이 이벤트를 전달할 수있다.

등록방법

스크린샷 2019-07-15 오후 10 48 30

하나의 버튼은 이벤트를 전달할 여러 개의 액션메소드를 지정할 수있다.

스크린샷 2019-07-15 오후 10 44 19

위의 스크린샷과 같이 하나의 버튼의 이벤트를 보낼 액션메소드를 이미 구현되어있는 액션메소드로 지정할 수있다.

UIControl.Event

Control Event  
Event Description
touchDown 컨트롤을 누를 때 발생하는 이벤트
touchDownRepeat 컨트롤을 연속해서 누를 때 발생하는 이벤트
touchDragInside 컨트롤 내부에서 드래그가 이루어질 때 발생하는 이벤트
touchDragOutside 컨트롤 외부에서 드래그가 이루어 질 때 발생하는 이벤트
touchDragEnter 컨트롤이 외부에서 드래그를하며 내부로 드래그를 할 때 발생하는 이벤트
touchDragExit 컨트롤의 외부로 드래그를 할 때 발생하는 이벤트
touchUpInside 컨트롤 영역 안쪽에서 터치하고 손을 뗏을 때 발생하는 이벤트
touchUpOutside 컨트롤 영역 안쪽에서 터치 후 컨트롤 외부에서 손을 뗏을 때 발생하는 이벤트
touchCancel 컨트롤의 현재 터치를 취소햇을 때 발생하는 시스템이벤트
valueChanged 컨트롤을 드래깅이나 다른 방법으로 조작해서 값이 변경됐을 때 발생하는 이벤트
primaryActionTriggered 버튼이 눌릴때
editingDidBegin UITextField에서 수정이 시작될 때 발생하는 이벤트 ( 텍스트 필드를 터치했을 때)
editingChanged UITextField에서 텍스트가 변경되었을 때 발생하는 이벤트
editingDidEnd UITextField에서 수정이 끝났을 때 발생하는 이벤트 (텍스트 필드에서 포커싱이 사라질 때)
editingDidEndOnExit UITextField의 편집중에 키보드의 return을 눌렀을 때 발생하는 이벤트
allTouchEvents 모든 터치 이벤트
allEditingEvents UITextField에서 모든 편집 이벤트
applicationReserved 앱의 사용에 따라 지정할 수 있는 컨트롤 이벤트 값의 범위
systemReserved 내부 프레임워크 내에서 사용되는 예약된 컨트롤 이벤트 값의 범위
allEvents 시스템 이벤트를 포함한 모든 이벤트

 

'iOS' 카테고리의 다른 글

URLSession Tutorial: Getting Started 번역본  (1) 2019.10.20
iOS) Segue  (0) 2019.07.23
iOS) ViewController의 특징과 생명주기  (0) 2019.07.23
iOS) UITabBarController, UITabBar  (0) 2019.07.13
Comments