TextView 글자수 제한(with 한글)
by 사슴비행기와..씨...
진짜 이것때문에... 2일동안 고민했다.
Wanted Process
=> 글자수 제한에 걸리면 글자가 입력될 수 없어야 한다.
=> 붙여넣기를 했을 때 붙여넣기 전에는 글자수 제한에 걸리지 않았지만 붙여넣은 후 걸리게 된다면 붙여넣을 글자에서 초과된 만큼을 빼서 추가되도록 한다.
=> 특정 영역을 선택하여 붙여넣기를 한결과 해당 부분에 replace되어야 한다.
=> 이 경우도 replace된 이후의 글자수가 초과될 경우 붙여넣을 글자를 초과된 만큼을 빼서 추가되도록 해야 한다.
=> 조합문자의 경우에도 마지막 글자까지 입력될 수 있어야 한다. (글자수 제한만 하면, 마지막 글자 앞글자에 받임이 있는 경우 마지막 글자는 자음밖에 입력되지 않음)
=> 마지막 부분에 붙여넣기를 하는 경우
=> 중간부터 마지막 부분까지 선택해서 대체하기로 붙여넣는 경우
=> 중한 일부분을 대체하기로 붙여넣는 경우
Limit TextCount
=> 정말 글자수 제한에 걸렸을 때 입력되지 않는 기능만 된다. (OK)
=> 붙여넣기 시, 붙여넣은 후 총 글자수가 글자수 제한에 걸려버리면 붙여넣기가 아예 안된다. (Nop)
=> 마지막 글자가 모음, 자음에서 멈춰버린다. (Nop)
Limited Paste
=> 글자수 제한에 걸렸을 때 입력되지 않는다. (OK)
=> 붙여넣기 시, 글자수 제한에 걸릴 길이면, 가능한 만큼만 붙여넣어진다. (OK)
=> limit count에서 +1한 글자수까지 받아서 마지막 글자를 온전히 받을 수 있다. (OK)
=> 이렇게 되면 1개의 글자수를 초과해버리지만, textViewDidEndEditing 메서드에서 삭제가 된다. (키보드에서 Done버튼을 눌렀을 때) (OK)
=> 마지막 부분에 붙여넣기를 하는 경우 (OK)
=> 중간부터 마지막 부분까지 선택해서 대체하기로 붙여넣는 경우 (OK)
=> 중한 일부분을 대체하기로 붙여넣는 경우 (OK)
=> 출처: https://stackoverflow.com/a/23155325
이렇게까지만 하는게 제일 깔끔하다.
이 때 textViewDidEndEditing 메서드 보다 textViewDidChange가 더 빠르게 불려지는데 (다음 글자를 입력하는 순간) 여기서 마지막 글자를 지우게 되면 이상한 현상을 마딱뜨릴 수 있다. ▼
29CM를 Sample로 보고 해서 확인해봤는데 29CM가 딱 이렇게 잘못 지정해 둔 케이스였다.
shouldChangeTextIn에서 true를 return 하면 위 사진에서 보이는 것 처럼 자동완성 부분에서 계속 글자가 입력되고 있는 게 보일거다. 저렇게 계속 입력이 가능한 상태가 된다.
만약 false로 return 하면 저 자동완성 부분에도 더이상 글자가 추가되지 않는다.
이 테스트를 보아 추측하기로는 글자가 계속 입력되는데, textViewDidChange에서 마지막 글자를 계속 삭제하니
그 위치에 자동완성에 입력된 텍스트가 대치되면서 생기는 문제같다.
암튼 아까 위에서 "여기까지만 하는게 제일 깔끔하다"라고 한 부분까지만 하는게 가장 현명하다.
근데도 해결해보고자 한다면, 정규식체크와 한글 받침 유무를 따져서 '을/를'을 붙이는 코드들이 있다 (구글링 해보면,)
그걸 활용해야 할 것 같은데 나도 아직 playground에서 시범중이다.
근데 이렇게 방법을 마련한다고 해도 특수문자까지 생각해야하기 때문에
$%. (스페이스) ^&* 등도 문제지만 아래와 같은 이모티콘도 분류를 해주어야 한다.
💉🦠🧻🧽☺️🤣🚜🤍❤️🇰🇷
=> 이런 이모티콘을 사용할 경우 정규식이나 받침 유무를 체크할 때 crash가 난다. = 앱이 갑자기 멈추거나 꺼짐
=> 그리고 shouldChangeTextIn에서 정규식을 계속 체크를 해야한다는 말인데 이 메서드는 "ㅏ"이런 글자 하나만 써도 들어온다. 즉, 엄청난... 에너지 낭비 효과도 얻을 수 있다. (성능에 문제가 생길 수도 있다고 생각하지만 검사까지는 못해봤다.)
그니깐... 그냥 깔끔한 선에서 마치도록 하자...
깔끔한 선에서 마친 예시 ▼
(MaxCount를 10으로 주고 11자리까지 받은 다음 마지막에 한자리를 지운 결과)
(11...에서 멈추는게 굉장히 거슬리지만 일단은 어쩔 수 없다.)
'swift > correct a mistake' 카테고리의 다른 글
Duplicate interface definition for class 'Something file In Pods' (0) | 2021.12.23 |
---|---|
Localization 사용하기 in Swift (0) | 2021.10.31 |
Xcode 자동완성 안될 때 (Auto Complete Not Working) (0) | 2021.10.10 |
UITableViewCell Self-Sizing Not Work!!!! (2) | 2021.10.07 |
stackView의 constraint 조정 중에 발생한 The process has been left at the point where it was interrupted 에러 (0) | 2021.10.04 |
블로그의 정보
Beautiful Coding
사슴비행기