본문 바로가기

Swift

@IBAction, 뷰끼리 값전달, 델리게이트, 최초 응답자 간단한 정보

반응형

@IBAction 타입 지정할 때 기준

개별 타입을 선택해야 할 때

  • 액션 메소드를 호출한 컨트롤의 속성값이 필요하거나, 이를 제어해야 할 때

Any 타입을 선택해야 할 때

  • 서로 다른 타입의 컨트롤이 동일한 액션 메소드를 호출하게끔 처리하고 싶을 때
  • 액션 메소드를 호출한 컨트롤의 정보가 필요 없을 때
  • 개별 타입을 반드시 사용해야 하는 경우를 제외한 나머지 모든 경우

뷰 사이에서 값 전달할 때 프로퍼티로 받는 이유

  • A뷰에서 B뷰로 값을 넘길 때 아울렛 변수에 바로 받지 않고 프로퍼티에 받는 이유는 아울렛 변수는 외부에서 값을 직접 대입할 수 없는 변수이기 때문입니다.
  • 또한, 아울렛 변수는 외부 객체에서 직접 참조할 수 없도록 제한되어 있습니다.
  • private 변수로 생성되어 있다고 생각하면 될 것 같습니다.
  • 그래서 프로퍼티를 생성하여 값을 받고 넘겨줍니다.

델리게이트

  • 델리게이트 패턴이 사용되는 가장 대표적인 예는 이벤트 리스너(Event Listener)
  • 델리게이트 프로토콜의 이름은 항상 해당 객체의 클래스명 + Delegate
  • ex : UITextField -> UITextFieldDelegate

최초 응답자 (First Responder)

  • UIWindow 객체는 사용자 인터페이스 구조에서 가장 가까이 위치한 객체로 , 사용자로부터 발생하는 터치 관련 이벤트를 내부 객체로 전달하는 역할을 합니다.

  • 이를 위해 UIWindow는 이벤트가 발생했을 때 우선적으로 응답할 객체를 가리키는 최초 응답자라는 포인터를 가지고 있습니다.

  • 예를 들어 화면에 진입하자마자 포커스를 주고 싶은 텍스트필드에 최초 응답자를 지정(?)합니다.

  • 주의사항

    • 뷰를 상속받은 하나의 객체인 UISlider 객체는 터치 이벤트를 입력받아 처리하지만, 최초 응답자 상태를 허용하지 않습니다.
    • 화면에 키보드가 표시된 상태에서 다른 요소를 건드려도 키보드가 사라지지 않는 것은 이 때문입니다.
    • 다른 요소를 터치하더라도 그 객체가 UIResponder를 상속 받지 않았다면 터치 이벤트만 발생할 뿐, 최초 응답자 포인터는 텍스트 필드를 그대로 가르키기 때문
    • 따라서, 최초 응답자 객체를 해제하기 위해서는 해제하는 메소드를 사용해 없애줘야 키보드를 없앨 수 있습니다.
  • 사용방법

    let textField = UITextField() textField.becomeFirstResponder() // 최초 응답자 지정 (키보드가 나타나고 입력상태가 된다.)

    // 기타 작업 코드 작성

    textField.resignFirstResponder() // 입력이 완료되면 최초 응답자 객체를 해제 (키보드가 사라진다.)

참고

꼼꼼한 재은 씨의 스위프트 기본편

에러메세지 처리

Expression type '()' is ambiguous without more context → 에러메세지는 Equatable 추가해야될 경우가 종종 있음


반응형