ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 로 iOS 앱 만들기 - 06 : 스위프트 키보드 내리기 / lazy var
    Swift 2019. 7. 14. 18:18

     

    다음과 같은 화면을 만들고

    빈 화면을 클릭했을 때 와 키보드의 Return 버튼을 클릭했을 때, 키보드가 내려가는 것을 하고자한다.

     

     

     

     

    1. UITextFieldDelegate 사용 (Delegate 개념 이해)

    https://tono18.tistory.com/25

     

    Swift - Delegate 정리

    Delegate 는 대리자(위임하다) 라는 뜻이며, 어떤 객체에서 일어나는 모든 일 (이벤트)을 하나의 객체가 처리하지않고 처리해야하는 일 중 일부를 다른 객체에서 처리(작성)해주는 것을 말한다. 즉 A의 일을 B가..

    tono18.tistory.com

     

     

    2. 예제 화면 코드 와 lazy var  설명 

    설명은 더보기를 클릭하여 볼 수 있다.

    ...더보기

    코드를 깔끔하게 작성하기 위해서 전 포스팅처럼 BaseViewController를 만들어주었고,

    MainViewController 에서 각각의 button, label, textFeild를 생성하여 위치를 잡아주었다.

    * lazy var

    : 지연 변수, 간단하게 말하면 게으른 변수이다. 
    쉽게 설명하면 처음부터 보여주고 싶지않고 사용자가 어떤 행동을 했을 때만 보여주고  싶을 때 처음부터 만들어놓고 그걸 들고 다니면서  필요할 때 꺼내는 것은 자원 낭비다.(필요없는데 계속 들고 다녀야하니까)

    그래서 인스턴스화를 시키지 않고  넘어간 다음에, 나중에 그것을 처음으로 부르는 순간 (필요하다고 하는 순간) lazy var로 선언한 것을 인스턴스화 시키는 것이다. 

     

     

    그럼 왜 여기서  nameTextField  을  lazy var 로 선언했는가? 

    nameTextField 코드를 보면 아래와 같은 코드가 있다.

     

     

    이 부분은 아까 설명했었는데 Delegate는  A의 일을 B가 대신 해주는 개념이라고 했다. 

    이때  대리자(위임자) 가 누구 인지 알려주어야한다. 즉 이 일을 받아서 처리할 객체가 누구인지 알려주어야 한다. 

    여기서 self는 위에서 말했듯이 뷰 컨트롤러이다. 

     

    nameTextField가 일을 시키면 그거 할 객체 = ViewController

     

    그런데 문제는 코드는 위에서부터 내려오면서 버튼과 라벨, 그리고 텍스트 필드를 생성하고 있는 중이라

    아직 viewDidLoad() 까지 가지 않았기 때문에, 클래스가 만들어지지 않았는데

    여기서 갑자기

     

    " 내 대리자는 ViewController 야." 

     

    라고 말하는 것이다!

    즉, ViewController가 없는데 내 대리자는 ViewController이야 라고 말하기 때문에 오류가 난다.

     

    1. 따라서 lazy var 로 선언을 해서 처음에는 안 만들고
    2. 클래스의 인스턴스가 만들어져서 메모리가 로드가 된 후(viewDidLoad
    3. addSubView 에서  nameTextField 를 보는 순간 다시 lazy var에 가서 그때 인스턴스화 시키는 것이다.
      그 때는 이미 클래스가 인스턴스 화 된 이후라 대리자로 viewController를 지정할 수 있다. 

     

     

     

    3. Return 으로 키보드 내리기 (숨기기)

    새로운 파일을 하나 만들고 그 파일에

    extension(확장)으로 UITextFieldDelegate 를 코드를 작성한 MainViewController에 상속한다.

     

    UITextFieldDelegate에 있는 여러가지 중 리턴 버튼을 눌렀을 때인 textFieldShouldReturn 을 선택하고 

     

    그 안에 '키보드를 내려라' 는 코드를 입력하면 된다.

    textField.resignFirstResponder()

    이때 resignFirstResponder은  textField가 본인의 firstRespon 을 버리라는 의미가 된다.

     

    firstRespon는 이벤트 또는 동작 메시지를 수신하는 창의 첫 번째 응답자 객체이다.

    대부분의 경우 firstRespon는 사용자가 마우스 나 키보드로 선택하거나 활성화 한 뷰 객체이다.

    즉, 그 첫번째 응답자 객체에서 물러나라 라는 뜻이다.

     

     

     

     

    4. 화면 터치로 키보드 내리기 (숨기기)

    원하는 ViewController 에 이 코드를 추가해주면 빈 화면 (self.veiw)을 클릭했을 때 키보드가 내려간다. 

     

     

     

     

     

     

    -

    * 본 글은 글쓴이가 스터디를 하고 배운 내용을 정리하는 식으로 쓰여지기 때문에 완전 초보자의 글입니다. 
    틀린 부분이 있을 수도 있고 글의 흐름이 일정하지 않을 수 있습니다.*

    -

     

     

    댓글

Designed by Tistory.