[Swift] UIAlertController에서 검증합니다~ 문자 수에 따라 오류 메시지가 표시되고 버튼이 올바르지 않습니다~

17949 단어 iOSSwiftuikittech

개시하다


UIAlertController를 사용하여 유효성을 검사하는 방법입니다.
UIAlertController를 사용하여 유효성 검사를 위한 입력용 대화 상자를 만듭니다!이렇게 말하면 좀 미묘하지만 꼭 참고해 주세요.
이번에 실시된 것은 다음과 같다.
  • 5자를 입력하지 않거나 입력하지 않은 경우 등록 버튼이 무효가 됩니다
  • .
  • 5자 이상 입력할 경우 "5자 이내로 입력하십시오"라는 오류 메시지가 표시됩니다(오류 메시지를 제외한 일반 메시지는 항상 표시됨)

  • 컨디션


    Swift5
    Xcode13.3
    iOS15

    이루어지다


    필요한 곳에 호출할 수 있도록 UIAlertController를 확장합니다.

    확장 클래스


    import UIKit
    
    extension UIAlertController {
        static func addAlertWithValidation(
            register: @escaping (_ text: String) -> Void
        ) -> UIAlertController {
            let descriptionString = "入力してください"
            let validationString = "5文字以内で入力してください"
    	var alert = UIAlertController()
            var token: NSObjectProtocol?
            
            // UIAlertControllerを作成する
            alert = UIAlertController(title: "登録ダイアログ", message: descriptionString, preferredStyle: .alert)
            
            // 登録時の処理
            let registerAction = UIAlertAction(title: "登録", style: .default, handler: { _ in
                guard let textFields = alert.textFields else { return }
                guard let text = textFields[0].text else { return }
                register(text)
                guard let token = token else { return }
                // オブサーバ登録を解除・・・①
                NotificationCenter.default.removeObserver(token)
            })
            
            // キャンセル時の処理
            let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: { _ in
                guard let token = token else { return }
                // オブサーバ登録を解除・・・①
                NotificationCenter.default.removeObserver(token)
            })
            
            // テキストフィールドを追加
            alert.addTextField { (textField: UITextField!) -> Void in
                // テキスト変更の通知を受け取るためにオブサーバを登録する・・・②
                token = NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: nil, queue: nil) { _ in
                    let text = textField.text ?? ""
                    registerAction.isEnabled = false
                    if text.count > 5 {
                        // 入力文字が5文字より多い場合(バリデーションエラー)
                        let messageString = "\(descriptionString)\n\(validationString)"
                        let range: NSRange = NSString(string: messageString).range(of: validationString )
                        let alertText = NSMutableAttributedString(string: messageString)
    		    // validationStringのみを赤字にする・・・③
                        alertText.addAttributes([
                            .foregroundColor: UIColor.red,
                        ], range: range)
                        alert.setValue(alertText, forKey: "attributedMessage")
                    } else {
                        // 入力文字が5文字以内の場合(正常)
                        let alertText = NSMutableAttributedString(string: descriptionString)
                        alert.setValue(alertText, forKey: "attributedMessage")
                        if text.count != 0 {
    			// 登録ボタン非活性(未入力時)
                            registerAction.isEnabled = true
                        }
                    }
                }
            }
            // 登録ボタン非活性(初期表示)
            registerAction.isEnabled = false
            
            alert.addAction(cancelAction)
            alert.addAction(registerAction)
    
            return alert
        }
    }
    
    
    포인트는 3점입니다.
  • 입력 텍스트 필드를 추가할 때 입력 텍스트 변경에 대한 알림을 받기 위해 서버에 등록하기(②)
  • 오류를 확인할 때 메시지의 문자열의 일부분을 빨간색으로 변경해서 오류 메시지를 표시한다(③)
  • 가입 또는 취소 버튼을 눌렀을 때 UIAlertAction을 실행할 때 ②에 등록된 모니터 해제(①)
  • 소환자


    이것은 위에서 만든 방법을 사용한 것일 뿐이다.
    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
        
        @IBAction func tapButton(_ sender: Any) {
            present(UIAlertController.addAlertWithValidation(
                register: { text in
                    // 登録時の処理
                }
            ), animated: true)
        }
    }
    
    또한 방법에 파라미터를 추가하여 문자 수의 상한선을 입력해도 변할 수 있다.(상한 문자수 전달, 대화상자 유형 분류 후 enum 형식으로 전달 등)
    이렇게 하면 사용하기에 더욱 편리하고 레벨을 확장하여 준비한 맛도 더욱 크다.

    참고 자료


    https://faboplatform.github.io/SwiftDocs/1.uikit/042_uialertcontroller/
    https://stackoverflow.com/questions/39538098/how-to-disable-uialertaction-depending-on-uitextfield-in-uialertcontroller
    https://developer.apple.com/documentation/foundation/notificationcenter/1411723-addobserver
    https://www.yoheim.net/blog.php?q=20180301

    좋은 웹페이지 즐겨찾기