본문 바로가기

IOS

Swift - TextView PlaceHolder

TextField 같은 경우는 기본적으로 제공되는 기능입니다 하지만 TextField 같은경우는 한줄로만 표현할수 있어서,

TextView 를 통해 입력값을 받는 경우도 자주 있습니다 이번엔 TextView 에 PlaceHolder를 간단하게 달아보겠습니다

 

초기 보여줄 상태에 대해 초기화를 진행하고

텍스트를 입력하기 시작할때 현재 상태에 대해 비교를 합니다 (색상이 아닌, placeHolder 문자열로 비교 가능) -> textViewDidBeginEditing

입력을 마무리 했을경우 해당 문자열을 비교해서 PlaceHolder 를 재 구성 합니다. -> textViewDidEndEditing


1. 일반적인 방법

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var mTextView: UITextView!
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        mTextView.textColor = UIColor.lightGray
        mTextView.text = "일반 TextView 입니다."
        mTextView.delegate = self
    }
}

extension ViewController :  UITextViewDelegate {
    
    func textViewDidBeginEditing(_ textView: UITextView) {  
        if textView.textColor == UIColor.lightGray {
            textView.text = nil
            textView.textColor = UIColor.black
        }
    }
    
    func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text.isEmpty {
            textView.text = "일반 TextView 입니다."
            textView.textColor = UIColor.lightGray
        }
    }
}

 

2. RxSwift

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {

     @IBOutlet weak var mRxTextView: UITextView!
     
     let disposeBag = DisposeBag()
     
     override func viewDidLoad() {
        super.viewDidLoad()
     
     	mRxTextView.textColor = UIColor.lightGray
        mRxTextView.text = "Rx TextView 입니다."
        
        
        mRxTextView.rx.didBeginEditing
            .subscribe(onNext : {
            [self] _ in
            if mRxTextView.textColor == UIColor.lightGray {
                mRxTextView.text = nil
                mRxTextView.textColor = UIColor.black
            }
        }).disposed(by: disposeBag)

        mRxTextView.rx.didEndEditing
            .subscribe(onNext : {
            [self] _ in
            if mRxTextView.text.isEmpty {
               mRxTextView.text = "Rx TextView 입니다."
               mRxTextView.textColor = UIColor.lightGray
            }
        }).disposed(by: disposeBag)
     }
}

 

3. Done 버튼 달기

extension UITextView {
    func addDoneButton(title: String, target: Any, selector: Selector) {
            
            let toolBar = UIToolbar(frame: CGRect(x: 0.0,
                                                  y: 0.0,
                                                  width: UIScreen.main.bounds.size.width,
                                                  height: 44.0))
            let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
            let barButton = UIBarButtonItem(title: title, style: .plain, target: target, action: selector)
            toolBar.setItems([flexible, barButton], animated: false)
            self.inputAccessoryView = toolBar
        }
}
class ViewController: UIViewController {

    @IBOutlet weak var mTextView: UITextView!
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
		mTextView.addDoneButton(title: "Done", target: self, selector: #selector(textDone(sender:)))
	}
    
    @objc func textDone(sender: Any) {
            self.view.endEditing(true)
    }
}

4. 실행결과

'IOS' 카테고리의 다른 글

Swift - Firebase Dynamic Link  (0) 2021.11.27
SwiftUI - YoutubeKitPlayer  (0) 2021.11.17
Swift - Combine VS RxSwift  (0) 2021.08.21
Swift - UITableView + ListClick  (0) 2021.08.13
Swift - Property Wrapper  (0) 2021.08.06