Lined Notebook

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...에서 멈추는게 굉장히 거슬리지만 일단은 어쩔 수 없다.)

블로그의 정보

Beautiful Coding

사슴비행기

활동하기