투케이2K

271. (ios/swift) textFieldDidChange 사용해 실시간 텍스트 필드 글자 변경 이벤트 감지 및 입력 제한 설정 실시 - MaxLength 본문

IOS

271. (ios/swift) textFieldDidChange 사용해 실시간 텍스트 필드 글자 변경 이벤트 감지 및 입력 제한 설정 실시 - MaxLength

투케이2K 2022. 11. 11. 17:09

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

[소스 코드]

 

    // MARK: - [테스트 함수 정의]
    func testMain() {
        print("")
        print("===============================")
        print("[ViewController >> testMain() :: 테스트 함수 수행]")
        print("===============================")
        print("")
        
        
        // [로직 처리 수행]
        DispatchQueue.main.async {
            
            // [현재 연결된 뷰 화면 얻어오기 : IOS 15 대응]
            let scenes = UIApplication.shared.connectedScenes
            let windowScene = scenes.first as? UIWindowScene
            let window = windowScene?.windows.first
            
            
            // [뷰 화면 사이즈 확인 실시]
            let deviceHeight = self.view.frame.size.height
            let deviceWidth = self.view.frame.size.width
            
            
            // [디바이스 휴대폰 상태 바 높이 사이즈 확인 실시]
            var statusBarHeight: CGFloat = 0
            var statusBarWidth: CGFloat = 0
            
            if #available(iOS 13.0, *) {
                statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
                statusBarWidth = window?.windowScene?.statusBarManager?.statusBarFrame.width ?? 0
            }
            else {
                statusBarHeight = UIApplication.shared.statusBarFrame.height
                statusBarWidth = UIApplication.shared.statusBarFrame.width
            }


            // [컴포넌트가 생성될 값 지정 실시]
            let componentsHeight = 100.0; // [width 크기]
            let componentsWidth = 200.0; // [height 크기]
            let componentsX = (deviceWidth - componentsWidth) / 2; // [width 가운데 중앙]
            let componentsY = (deviceHeight - statusBarHeight - componentsHeight) / 2; // [height 가운데 중앙]
            
            
            // [CGRect 사용해 컴포넌트가 생성 될 사이즈 및 위치 설정 실시]
            let cgRect = CGRect.init(
                        x:componentsX, // [x]
                        y:componentsY, // [y]
                        width:componentsWidth, // [width]
                        height:componentsHeight // [height]
                    )
            
            
            // [컴포넌트 생성 실시]
            let textField = UITextField(frame: cgRect)
            
            
            // [컴포넌트 속성 부여 실시]
            textField.tintColor = .clear // 틴트 색상
            textField.layer.borderWidth = 1 // 테두리 굵기
            textField.layer.borderColor = UIColor.red.cgColor // 테두리 색상
            textField.text = "투케이" // 초기 텍스트 설정
            textField.textColor = UIColor.blue // 텍스트 색상
            textField.textAlignment = .center // 텍스트 정렬
            
            textField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged) // 텍스트 필드 실시간 데이터 변경 이벤트 감지

            
            // [뷰에 추가 실시]
            self.view.addSubview(textField)


        }
        
    }
    
    
    
    
    
    // MARK: - [실시간 텍스트 필드 값 변경 감지]
    @objc private func textFieldDidChange(_ textField: UITextField) {
        
        // [MaxLeng 길이 값 저장]
        let maxLength = 5
    
        
        // [실시간 입력 값 체크 실시]
        if let text = textField.text {
            print("")
            print("====================================")
            print("[ViewController >> textFieldDidChange() :: 텍스트 필드 실시간 데이터 변경 이벤트 감지]")
            print("====================================")
            print("")
                        
            if text.count > maxLength {
                
                // 제한 글자를 넘어가면 자동으로 키보드 내려감
                textField.resignFirstResponder()
            }
            
            // 초과되는 텍스트 제거
            if text.count >= maxLength {
                let index = text.index(text.startIndex, offsetBy: maxLength)
                let newString = text[text.startIndex..<index]
                textField.text = String(newString)
                
                print("")
                print("====================================")
                print("[ViewController >> textFieldDidChange() :: 텍스트 필드 초과 글자 제거 실시]")
                print("maxLength :: \(maxLength)")
                print("newString :: \(newString)")
                print("count :: \(newString.count)")
                print("====================================")
                print("")
            }
        }
    }
 

[결과 출력]

 

 

반응형
Comments