Post

UIKit - UITextField 여러 줄 입력 불가능한 이슈 UITextView를 통해 해결하기

UIKit - UITextField 여러 줄 입력 불가능한 이슈 UITextView를 통해 해결하기

UITextField를 통해 입력 필드를 구현한 후 테스트 도중 아래와 같은 이슈를 발견함…

image

위 화면처럼 글자가 아래로 내려가지 않고 옆으로만 계속 작성되고 있음.

알아본 결과 UITextField는 여러 줄이 아닌 한 줄로만 입력을 받을 수 있다고 함.

따라서, UITextField 대신 UITextView를 통해 처리해줘야함.

UITextField와는 크게 다르지 않으나, placeholder를 제공해주지 않기 때문에 직접 Delegate 메서드를 구현해서 처리해줘야함.

TodoAddView.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import UIKit

class TodoAddView: UIView {

  ...

    // MARK: - 할일 세부 사항(또는 메모) 텍스트 뷰
    let todoDescriptionTextView: UITextView = {
        let textView = UITextView()
        
        textView.backgroundColor = UIColor(named: "textFieldColor")
        
        textView.font = UIFont.systemFont(ofSize: 17)

        // placeholder가 제공되지 않기 때문에 text에 설정 후 Delegate로 처리
        textView.text = Constant.DESCRIPTION_PLACEHOLDER
        textView.textColor = .createdDate
        
        textView.layer.borderColor = UIColor.gray.cgColor
        textView.layer.borderWidth = 0.3
        
        textView.clipsToBounds = true
        textView.layer.cornerRadius = 8
        
        textView.translatesAutoresizingMaskIntoConstraints = false
        
        return textView
    }()

  ...

    // MVC 패턴을 적용하여 View와 Controller가 분리되어 있기 때문에 Controller에서 넘겨줄 수 있도록 메서드를 만듬
    func setTextViewDelegate(delegate: UITextViewDelegate){
        todoDescriptionTextView.delegate = delegate
    }
}

TodoAddViewController.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import UIKit

class TodoAddViewController: UIViewController {

    // View 인스턴스 생성
    let todoAddView = TodoAddView()
    
    override func loadView() {
        // loadView 시점에 View 설정
        self.view = todoAddView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Delegate 설정
        todoAddView.setTextViewDelegate(delegate: self)
        setupNavigation()
    }

    ...
}

// MARK: - TextView Delegate
extension TodoAddViewController: UITextViewDelegate{

    // TextView가 focus를 얻는 경우 실행됨
    func textViewDidBeginEditing(_ textView: UITextView) {
        if textView.text == Constant.DESCRIPTION_PLACEHOLDER {
            textView.text = nil
            textView.textColor = .white
        }
    }
    
    // TextView가 focus를 잃는 경우 실행됨
    func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty{
            textView.text = Constant.DESCRIPTION_PLACEHOLDER
            textView.textColor = .createdDate
        }
    }
}

결과

image

Reference

This post is licensed under CC BY 4.0 by the author.