iOS에서 커서 위치를 추적하고 싶습니다.
11607 단어 iOSObjective-C
하지만 굳이 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
Reference
이 문제에 관하여(iOS에서 커서 위치를 추적하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ma_sh/items/544b3b2090b95943643e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)