본문 바로가기
Developer/iOS, Swift

[Swift] TextView에도 Placeholder가 넣고 싶을 때?

by Doony 2019. 12. 9.

스위프트에 유사한 텍스트 입력기로, textFieldtextView가 있습니다. 전자는 한 줄 입력을 받을 때 사용하고, 후자는 긴 인풋 데이터를 받을 때 주로 사용하는데요. 문제는 textView에는 placeHolder가 없다는 것입니다.

 

그렇다면 placeHolder가 뭘까요? 말그대로 플레이스 홀더입니다. 즉 미리 특정 내용이 보여질 수 있게 해주는 건데요. 예를들어 앱에서 리뷰를 작성하다고 하면, 해당 부분에 회색 글씨로 "리뷰를 작성해주세요" 라고 써 있는 것을 본 적이 있을겁니다. 실제 입력된 내용은 아니지만, 미리 그 위치에 보여줌으로써 유저의 사용성을 개선하는 역할을 한다고 보시면 될 것 같습니다.

 

그렇다면 textView에 어떻게 placeHolder을 넣는 것일까요? 일종의 트릭을 써서, textView 내에 아예 text로 내용을 미리 입력시켜놓고, 색상을 회색으로 바꿔놓는 것입니다. 유일한 방법은 아니지만, 비교적 사용법이 간단해서 저는 주로 사용하고 있습니다.

사용 절차는 다음과 같습니다.

 

  1. textView가 위치한 컨트롤러에 UITextViewDelegate를 상속시킵니다.
  2. 아래 내용을 추가하고, viewDidLoad 등에 placeHolderSetting을 선언해주면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
    func placeholderSetting() {
        txtvReview.delegate = self // txtvReview가 유저가 선언한 outlet
        txtvReview.text = "제가 바로 PlaceHolder입니다."
        txtvReview.textColor = UIColor.lightGray
        
    }
    
    
    // TextView Place Holder
    func textViewDidBeginEditing(_ textView: UITextView) {
        if textView.textColor == UIColor.lightGray {
            textView.text = nil
            textView.textColor = UIColor.black
        }
        
    }
    // TextView Place Holder
    func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text.isEmpty {
            textView.text = "제가 바로 PlaceHolder입니다."
            textView.textColor = UIColor.lightGray
        }
    }
cs

 

간단합니다. 처음 화면이 뜨면 "제가 바로 PlaceHolder입니다." 라고 lightGray 색상으로 보여줄 것입니다.

이 때 유저가 textView를 클릭하면, textViewDidBeginEditing이 실행되면서 미리 입력되어있던 text는 사라지고 색상도 검은색으로 바뀌죠.

 

유저가 textView 편집을 다 마쳤으면, textViewDidEndEditing이 실행됩니다. 이 때 만약 아무 내용도 없다면, 다시 원래 있던 placeHolder text를 띄워줍니다.

 

이 때 유의할 점이 한가지 있습니다.

저 같은 경우, 리뷰를 작성하는 예시였는데요. 해당 리뷰를 서버로 post하는 과정에서 text가 빈 값이면 이를 유저에게 인지시켜주고, 내용을 입력하라는 alert를 띄워야했습니다.

그런데 유저가 입력하지 않았더라도, textView는 text를 갖고 있습니다. 즉 isEmpty함수가 false로 뜨겠지요. 왜냐하면 placeHolder로 셋팅된 내용이 text로 인식되기 때문입니다.

 

그래서 저는 textView의 현재 text의 isEmpty함수로 리뷰 작성 여부를 확인하지 않고, textView의 현재 text가 placeHolder로 셋팅된 string과 동일한지 여부로 확인했습니다.

약간 무식한 방법같긴하지만, 간단하니까요.

 

 

또 여담이지만, 안드로이드에 비해 다소 불편한 감이 있는 것 같습니다. 안드로이드는 textField, textView 구분없이 둘다 EditText로 구현할 수 있습니다. 또한 스위프트에서 placeholder 기능을 hint로 편리하게 구현할 수 있습니다.

댓글