티스토리 뷰

반응형

안녕하세요 :) Zedd입니다. 

제목이 많이 익숙하실거에요..!!! 바로 TextField delegate 메소드 중 하나인


  1. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

            return true

        }



바로 요거

그냥 여러가지를 해보던 중



하나가 궁금해졌어요..!!

지금 print되고있는건, 


  1. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

            print(textField.text!,range.location, range.length)

            return true

        }



text와, range의 location과 length를 출력한건데, 위 움짤을보시면 알겠지만, location은 글자를 치면 칠수록 증가하고 지우면 감소하는 건 이해가 감 ㅇㅇ

근데 length는 하나도 증가 안하다가 딱 지울때만!!! 지울때만 1로 증가하고, 그 외에에는 증가하지 않는 것을 볼 수 있습니다. 

(range는 NSRange로 location과 length프로퍼티가 있습니다.)


또 한가지 상황을 볼까요?



"영역"을 선택하고 Cut하니까 



이렇게 length가 늘어난 것을 볼 수 있씁니다.

일단 저는 



왜..? 

왜 지울때만...왜 지우는데...왜..지우는데..왜 length가 증가하는거지..?아니 지우는데.....

그래서 굉장히 궁금했는데, ㅂㅁ님(..)의 도움을 받아 알게되었습니다.


일단 저걸 출력하는곳이 어디랬죠?


  1. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

            print(textField.text!,range.location, range.length)

            return true

        }



바로 이 메소드입니다.  그리고 첫번째가 내 textfield의 text, 두번째가 range의 location, 세번째가 그 문제의 range의 length입니다.

여기서 집중해서 봐야 할 곳은 바로


  1. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

            print(textField.text!,range.location, range.length)

            return true

        }



입니다.  should Change Characters In range. 이 range안에서 character. 즉 "문자"가 변경되었다는 걸 알려주는게 이 range의 역할입니다.

"문자"라는 점에 주목해주세요. 

일단 location을 봅시다. 


...그 전에..!!!!!!! 위 메소드의 정의를 보고 가는게 좋을 것 같네요 :)


정의는 

"Asks the delegate if the specified text should be changed."

"지정된 text를 변경해야 하는 경우, 대리자에게 요청합니다."입니다.


texfielf는 사용자 액션에 의해  text가 변경 될 때 마다 이 메소드를 호출합니다. 이 메소드를 사용하여 사용자가 입력 한 대로 text의 유효성을 검증하십시오. 예를들어, 이 메소드를 사용하여 사용자가 숫자 값 이외의 값을 입력하지 못하게 할 수 있습니다.


< 매개변수 >

- textfield : text를 포함한 textfield입니다.

- range : 바꿀 문자의 범위

- string : 지정된 범위의 대체 문자열(replacement string)입니다. 입력하는 동안 이 매개변수는 일반적으로 입력 된 새 문자 하나만 포함하지만, 사용자가 text를 붙혀넣는 경우, 더 많은 문자를 포함 할 수 있습니다. 사용자가 하나 이상의 문자를 삭제하면 대체 문자열이 비어있습니다. 


정의도 봤으니 진짜 location을 보러 가봅시다. 




말그대로 "위치"입니다. 다만 현재 바로 "전"을 나타내요. 이게 뭔소리지??하실지도 모르지만...해보시면 압니다.

textfield에는 현재 "abcdef"지만 오른쪽 text에는 "abcde"까지 밖에 안나와있죠? 내가 문자를 치기 바로 전 text에 관한 정보들이 나오게 됩니다.

location은 딱 봤을 때 어떤 값을 의미하는 것 같나요? 문자를 칠 수록 같이 늘어나고,





문자를 지울수록 줄어들죠. 그냥 해당 문자의 "위치"라고 생각하시면 됩니다. 

그럼 length를 볼게요. 아 진짜 이거는 그냥 해보면서 확인하시면 좋아요. 

제 생각엔 이 글을 읽으신다고 이해가 갈거라곤 생각하진않아요......

그냥 정말 간단한 프로젝트니까 그냥 한번 만들어서 확인 해보세요..!!




딱 저 빨간색 네모..!! 1이 증가된 상황이 이제 "지우기" 시작한 상황입니다. 

이게 뭘 의미하냐?? 지금 이 range안에!!!!!!!!!!!!!range안에서!!!!!!!!!!!! "변경"이 일어났다!!!!는 말입니다. 변경이 일어났는데 1만큼 "길이"의 변경이 일어났다는 겁니다.


abc 3 0의 상황에서는 사실 textfield에는 abcd가 있었을 거에요.

근데 abcd에서 딱 한번 delete를 누르면 abcd 3 1이라는게 뜹니다. 이 이유는?? 

abcd 3번째 위치로부터 1만큼 길이의 범위에서 "변경"이 일어났어 ㅇㅇ라는 의미입니다. 

계속 지우는데 length가 계속 1인 이유는? 

이건 "문자"에 관한 메소드기 때문에 location도 계속 줄어들기 때문이죠.

아 뭔가 좀 감이 오시나요???이건 진짜 해보면서.....그러니까..느껴야합니다...아 이런 느낌이구나?...이런거


그럼 아까 또다른 상황.

'

"잘라내기"를 했을때는 length가 1이 아니라 막 엄청 바뀌었었죠.

이 이유도 정확히 똑같습니다. 



(아니 나는 start만 복사했는데 붙혀넣기하면 "(공백)start"가 들어가네요;;; 조금 헷갈...아무튼 location은 공백까지 포함한다는것을 명심하세요.)

아무튼 11 0 -> 12 5에서 뭔가 "변경"이 일어났다는 것을 볼 수 있네요.


start ==> 5섯글자 ㅇㅇ =>  5 0

start(공백) start ==> 11글자 ㅇㅇ ==> 11 0 (지금 이 상황에서 textfield는 "start start start"임)


start(공백)start(공백)start

마지막 start를 범위로 선택해서 Cut함. 앞에 공백까지는 선택안함.


그러면 12 5는 뭘 의미하냐???????


start(공백)start(공백) ==> 총 12글자 ==> 위치가 12인 곳에서부터 길이 5만큼의 "변경" 이 일어났어!!!!!!!!!!!!!

start가 길이가 5죠? 이걸 Cut했으니 길이 5만큼의 변경이 일어났다는 소리입니다.


뭔가 이해가 가시나요??


위 전체 범위를 선택하고 Paste를 눌렀다면 아래 그림처럼 되겠죠?

이때의 location과 length의 변화를 이제 추측하실 수 있으신가요?



네. 마지막에 있죠? 0 11이 나오게 됩니다.

이게 무슨뜻이냐!!!!!!!!!야 위치 0부터 길이가 11만큼의 범위에서 변경이 일어났어 ㅇㅇ라는!!!!!!!!!!의미인것입니다.


아시겠나요...!!!!!!!!!!!!!!!!

뭔가 저는 이 메소드를 그렇게 깊게 생각하지 않고 썼었는데, 깊게 생각하니 굉장히 헷갈리지만 꼭 알아야 합니다. 

뭔가 내 textfield에 세밀한 조정?..을 하고싶으면요.

만약 이해가 잘 안가신다면 꼭 프로젝트를 하나 만들어서 range를 출력해보는 걸 추천드려요.

그리고 제 내용에서...혹여나 틀린부분이 있을지도 모릅니다..!!!! 혹시 있다면 꼭!!!!!!!!!!!!!!! 꼭 꼮 댓글이나 PC화면 오른쪽 하단에서 보실 수 있는 채널서비스를 통해 메세지 주시면 감사하겠습니다 :)

이글이..저와 같은 궁금증을 가지고 있으신 분들께 도움이 되었으면 좋겠네요 :)

반응형