Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] UITextField, UITextView 엔터 버튼, Done 버튼 처리 방법 본문

iOS 기본 (swift)

[iOS - swift] UITextField, UITextView 엔터 버튼, Done 버튼 처리 방법

jake-kim 2022. 1. 29. 03:11

Done 버튼 탭 시 입력

* 코드로 UI 작성에 편리를 위해 사용한 프레임워크

  - SnapKit

  - Then

pod 'SnapKit'
pod 'Then'

Done 버튼 탭 시 동작 아이디어

  • Done 버튼을 탭하게 되면, escape string 값 '\n' 입력으로 처리되는 형태이므로, textField(_:shouldChanceCharactersIn:replacementString:) 델리게이트에서 처리
  • `\n`값을 받은 경우, 입력되는 처리를 한 후 false를 리턴하여, \n 입력을 막는 형태

UI 준비

  • Done버튼이 눌렸을 때 UILabel에 값을 입력하는 형태
    • UILabel - 텍스트 필드의 결과값 입력
    • textField - 인풋
// ViewController.swift

import UIKit
import SnapKit
import Then

class ViewController: UIViewController {
  private let label = UILabel().then {
    $0.textColor = .systemBlue
    $0.font = .systemFont(ofSize: 32)
    $0.text = "result: "
  }
  private let textField = UITextField().then {
    $0.returnKeyType = .done
    $0.borderStyle = .roundedRect
    $0.textColor = .black
    $0.placeholder = "input..."
  }
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    self.view.addSubview(self.label)
    self.view.addSubview(self.textField)
    
    self.label.snp.makeConstraints {
      $0.top.equalTo(self.view.safeAreaLayoutGuide).inset(36)
      $0.centerX.equalToSuperview()
    }
    self.textField.snp.makeConstraints {
      $0.top.equalTo(self.view.safeAreaLayoutGuide).inset(120)
      $0.centerX.equalToSuperview()
    }
  }
}
  • textField delegate 설정
    • delegate 준수
      self.textField.delegate = self
    • \n 문자열이 들어올 때 ( = Done버튼이 눌린 경우), 입력 처리 후 false를 리턴하여 textField에는 아무런 입력이 되지 않도록 처리
      extension ViewController: UITextFieldDelegate {
        func textField(
          _ textField: UITextField,
          shouldChangeCharactersIn range: NSRange,
          replacementString string: String
        ) -> Bool {
          guard string != "\n" else {
            self.label.text = "result: " + (textField.text ?? "")
            return false
          }
          return true
        }
      }

 

Comments