AIR 1.1 이후 한글 입력 버그 수정하기

문제점 : AIR 1.1 이후 한글 입력시 글자를 지우기 시작한 글자의 초성이 잘 삭제되지 않는 버그가 있다.

해결책 : 내부 TextField 객체에 접근해 커스텀 이벤트 핸들러를 추가하고, 특정 조건에 따라 초성을 강제 삭제하도록 한다.

이 문제는 꽤나 중요한 문제로 AIR 1.0 버전에서는 없던 문제이다. 

나는 이 문제에 대해 어도비사에 공식적으로 버그 리포팅을 한 적이 있고,

나뿐 아니라, 이희덕님이나 다른 여러 한국 개발자들도 이 문제에 대한 버그 수정을

어도비에 요구한 것으로 알고 있다.

그런데, 방금 전에 플렉스로 잠깐 코딩을 해 보니, 

이 문제는 의외로 간단하게 해결할 수 있다.

TextInput과 같은 컨트롤 내부에 있는 텍스트 필드에 접근해

이벤트 리스너를 추가하고, 특정 조건에 따라 

초성을 제거하면 되기 때문이다.

이 때 특정 조건은 다음과 같다.

1. keyUp 이벤트가 일어날 때마다 이전 문자열을 전역 변수에 저장해 놓는다.

2. 백스페이스를 누른 상태에서 현재 텍스트필드의 텍스트와 이전 텍스트가 같은지

확인한다. 이 때 혹시 뒤에 공백이 있을 수 있으므로, 공백을 제거한 문자열을 비교한다.

3. 만일 두 텍스트가 같다면, 이것 참 이상한 일이다. 어떻게 두 문자가 같을 수 있을까? 분명히 백스페이스를 눌렀는데 말이다!!!

4. 이런 경우는 백 스페이를 누른 위치를 기준으로 앞의 문자열과 뒤의 문자열을 잘라 새로운 텍스트를 텍스트 필드의 텍스트로 집어 넣는다. 이렇게 하는 이유는, 꼭 마지막 글자에서 백스페이스를 눌러서 글자를 지우지 않더라도, 글자 중간에 커서를 이동해 글자 중간부터 쓰다가 다시 글자 중간부터 지울 경우도 대비하기 위해서이다.

5. 이제 버그 없는 텍스트 인풋 컨트롤을 맘껏 사용한다.


물론 실제로 현업에서는 이렇게 애플리케이션 단에서 코딩을 하면 안된다. 

방법은 두 가지가 있을 수 있는데, 

하나는 TextInput이나 TextArea를 상속해 이 클래스에 위와 같은 로직을

추가하는 방식이고,

다른 하나는 유틸리티 클래스를 만들어서 TextInput 등의 컨트롤을 입력받아 

이런 로직을 처리하도록 하는 방식이다. 

두 방식 중 어떤 것을 사용해도 상관은 없겠지만,

기왕이면 전자의 방식이 보다 OOP 설계에 맞다고 할 수 있다. 

액션스크립트 원리
: TextInput, Text, Label, TextArea 등의 컨트롤은 모두 TextField 인스턴스에 대한 래퍼클래스들이다. 이들 인스턴스 안에 있는 TextField 인스턴스에 접근하면, 한글의 자,모음을 하나씩 제어하는 게 가능하다. 



크리에이티브 커먼즈 라이센스
Creative Commons License
2008/11/27 03:10 2008/11/27 03:10
REPLY AND TRACKBACK RSS http://joshy21.com/weblog/rss/response/40
REPLY AND TRACKBACK ATOM http://joshy21.com/weblog/atom/response/40
TRACKBACK ADDRESS
http://joshy21.com/weblog/trackback/40
tracked from 희희덕하며 웃어보자
tracked from 우야꼬의 Adobe RIA
REPLY RSS http://joshy21.com/weblog/rss/comment/40
REPLY ATOM http://joshy21.com/weblog/atom/comment/40
wrote at 2008/11/27 16:31
이야! 킹왕짱 에어레네님!
멋지십니다 ㅋㅋㅋ
eirene 
wrote at 2008/11/27 20:11
저야 모 허접합니다 ㅇㅇ ㅠ
wrote at 2008/11/27 18:55
좋은팁 감사합니다. ^^
eirene 
wrote at 2008/11/27 20:12
맆흘 감사드립니다 (_ _)/
eirene 
wrote at 2008/11/28 01:00
살짝 버그가 있어서 수정했습니다.

생각해 보니, 공백을 제거한 문자열을 비교하는 건 맞지 않은 것 같고요 (이건 저의 판단 착오)

백스페이스 키를 계속 누르고 있을 경우를 대비해 keyDown 이벤트에도 이벤트 리스너를 추가했습니다.
wrote at 2008/12/02 01:01
저도 해결책을 찾아보다가 다른 방법을 찾게되서
맘에 들진 않지만 그래도 어느정도 쓸만한거 같아서 트랙백 걸었습니다^^
eirene 
wrote at 2008/12/02 22:52
다시 보니 여러가지 버그가 있네요... 제 소스도 수정해야 하고, 희덕님이나 우야꼬님 소스도 수정해야 될 듯 합니다 ^^;

일단 희덕님 소스의 문제점은, 중간부터 글자를 지울 경우 글자를 지우기 시작한 다음에 있는 글자도 함께 지워진다는 겁니다... 우야꼬님 소스도 마찬가지구요...

이런 이유로 setSeleciton 부분은 조심스럽게 접근해서 조건을 까다롭게 줘야 할 거 같습니다... 지금 이 버그를 수정중인데, 하나를 수정하면 하나가 말썽이네요 ㅎㅎ

대충 눈에 안 띄게 만들어 놓기는 했는데, 정리되면 공개하겠습니다 ㅋㅋ
[로그인][오픈아이디란?]
이름 :
비밀번호 :
홈사이트 :
비밀글 :
*1  ... *68  *69  *70  *71  *72  *73  *74  *75  *76  ... *109 
count total 6875, today 4, yesterday 7
관리인 : eirene
rss
I am
전체
Development
La vie quotidienne
English
Languages
Jesus
글 보관함
2009/06, 2009/05, 2009/04, 2009/03, 2009/02,
달력
«   2009/07   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31