[ios] UITextView 의 Placeholder text 지우기 & 다른 곳을 터치하면 키보드 없애기

맥북 프로 샀었던 (이미 7월에 샀는데 -.,-) 기념으로 깨작거리기.

0. .h <-> .m 파일 switching : control+command+arrow up

1. UITextView 를 클릭했을 때 미리 입력된 Text 속성을 지우고 싶었다. 보통 <your message here> 이런 것을 미리 넣어놓고, 포커스되면 지우는 그런 UI 있잖슴. 그런데 UITextView 는 IBAction을 받지 못한다. (왜 그런지는 아직 모른다…이제 첫페이지 읽었다.) ViewController 가 UITextViewDelegate 프로토콜을 구현하면 된다고 한다.

@interface 당신의ViewController : UIViewController

대신

@interface 당신의ViewController : UIViewController <UITextViewDelegate>

이렇게 입력하고 마우스를 UITextViewDelegate 쪽으로 가져가면 xcode quick help가 UITextViewDelegate Protocol Reference 링크를 보여준다. 거기가서 쓱 보고 알맞은 함수를 찾자. 나는 포커스가 갔을 때 행동할 것을 구현하려고 했으니 textViewDidBeginEditing 함수를 구현하면 된다. 아참 중요한 게 있네. viewDidLoad 함수에 넣을 게 있다.

자기가_만든_UITextView의_IBOutlet변수.delegate = self;

이걸해야 UITextView 가 받는 이벤트를 ViewController 로 던지나보다.

 

2. UITextView 가 아닌 다른 곳을 터치하면 키보드가 사라지게 하고 싶었음. 검색해보면 과거 Interface Builder 를 주로 쓸 때의 예제 밖에 잘 없어서 삽질 좀 했다.

  1. 일단 스토리보드에서 배경에 해당하는 UIView를 터치한다.
  2. Identity Inspector 를 연다.
  3. Custom Class 항목에 Class 에 UIView 라고 아마 써있을텐데 이걸 UIControl 로 변경한다.
  4. Connections Inspector 로 가보자. Sent Events 가 생겼다! 오예~
  5. 뭐 그 다음은 버튼 연결하듯이 스토리보드로 가서 UIView를 Control 누른 상태로 ViewController.h 로 드래그 엔 드랍한다.
  6. 그럼 팝업 윈도우가 뜬다. Connection 에 Action을 선택
  7. 이름은 아무거나 나는 backgroundTouched 를 입력했음.
  8. Event 는 TouchDown 을 선택
  9. 자 이제 남은 건 새로 추가된 IBAction 함수 구현이다. 이건 쉽다. xcode documentation 에서 dismiss keyboard 로 검색하면 나온다. 요약하면 키보드를 부른 textView의 outlet 변수가 a 라면 [_a resignFirstResponder]; 라고 입력하면 된다.
- (IBAction) backgroundTouched:(id)sender {
    [_textView resignFirstResponder];
}

ps : 헤드퍼스트 아이폰~ 책 보고 있다. 1번을 뜬금 없이 찾게 된 계기는 예제에서 지들이 text 에 placeholder 넣어놓고, 그걸 지우는 예제가 없이 나중에 활용하는 코드가 이어 나와서 아놔 이뭐병 이러다가 찾게되었어..