iOS에서 커서 위치를 추적하고 싶습니다.

11607 단어 iOSObjective-C
최근에는 Swift도 Version3이 되었네요.
하지만 굳이 Objective-C에서. (Swift 쓸 수 없다)

커서 위치를 얻고 싶습니다.



UITextField(또는, UITextView)로 문자를 칠 때 커서의 위치를 ​​취득하고 싶다고 하는 것이 있었습니다.

이 파란색 선의 위치입니다.

다음과 같이 얻을 수 있습니다.

sample.m
UITextRange *textRange = textField.selectedTextRange;
UITextPosition *startPosition = textRange.start;

이런 식으로 UITextPosition이라는 클래스의 값을 얻을 수 있습니다.
UITextPosition…!?

UITextPosition이라든지 다루기 어려울 것 같기 때문에, int(NSInteger)로 변환합니다.

sample.m
UITextRange *textRange = textField.selectedTextRange;
UITextPosition *beginning = textField.beginningOfDocument;
UITextPosition *startPosition = textRange.start;
NSInteger pos = [textField offsetFromPosition:beginning toPosition:startPosition];

이제 커서의 위치를 ​​숫자로 얻을 수 있습니다.

그럼 이번에는 추적하고 싶습니다.



다음은 커서의 위치가 바뀔 때마다 값을 얻고 싶었습니다.
KVO를 사용합니다.
참고 : [Objective-C] KeyValueObserve(키 값 모니터링) 참고 - Qiita

sample.m
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:YES];
    [textField addObserver:self forKeyPath:@"selectedTextRange" options:NSKeyValueObservingOptionNew context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    UITextRange *textRange = textField.selectedTextRange;
    UITextPosition *beginning = textField.beginningOfDocument;
    UITextPosition *startPosition = textRange.start;
    NSInteger pos = [textField offsetFromPosition:beginning toPosition:startPosition];
}

이제 위치가 바뀔 때마다 얻을 수 있습니다!

라고 생각했습니다만, 문자를 쳤을 때에는 불려 가지 않았습니다…

UITextField의 text가 재기록되었을 때에 메소드를 부른다



UITextField의 대리자 메서드를 사용합니다.

sample.m
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    NSInteger pos = range.location+string.length;
    return YES;
}

이것으로 좋은 느낌입니다. (귀찮게 되었기 때문에, 자세한 해설은 하지 않습니다.)

이상!



이제 커서 위치를 추적. NSInteger 형의 값으로 취득할 수 있습니다.

sample.m
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:YES];
    [textField addObserver:self forKeyPath:@"selectedTextRange" options:NSKeyValueObservingOptionNew context:nil];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    pos = range.location+string.length;
    return YES;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    // ほんとだったらkeyPathできちんとチェックしてください…
    UITextRange *textRange = _textField.selectedTextRange;
    UITextPosition *beginning = _textField.beginningOfDocument;
    UITextPosition *startPosition = textRange.start;
    pos = [textField offsetFromPosition:beginning toPosition:startPosition];
}

더 좋은 방법이 있으면 알려주세요 ...

참고 URL



[Objective-C] KeyValueObserve(키 값 모니터링) 참고 - Qiita
the moon at dawn: UITextField의 캐럿 조작(UITextRange 및 UITextPosition)
ios - UITextPosition to NSRange - Stack Overflow

좋은 웹페이지 즐겨찾기