Swift

Swift 로 iOS 앱 만들기 - 06 : 스위프트 키보드 내리기 / lazy var

tononi 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)을 클릭했을 때 키보드가 내려간다. 

 

 

 

 

 

 

-

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

-