【问题标题】:Detecting selection change on a UITextView?检测 UITextView 上的选择更改?
【发布时间】:2013-07-27 17:05:33
【问题描述】:

有没有办法检测用户何时更改文本视图中所选文本的范围(在 UITextView 的子类中)? 我找不到任何 NSNotification。我尝试观察键值,但未调用所选范围的观察者

[self addObserver:self forKeyPath:@"selectedRange" options:NSKeyValueObservingOptionNew context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqual:@"selectedRange"])
    {
        // Do stuff
    }
}

我不想使用 UITextView 的委托方法

【问题讨论】:

  • 委托有什么问题?
  • 文本更改时是否需要通知?
  • @AbdullahShafique 我正在编写一个自定义 UITextView,但是在 UITextView 本身内部使用委托,它不再可以在其他地方使用(例如:在 UIViewController 中)
  • 文本更改时是否需要通知?
  • 我不是在寻找文本更改,我在寻找 SELECTION 更改

标签: ios objective-c uitextview


【解决方案1】:

UITextView采用UITextInput协议。该协议包括一个必需的selectedTextRange 读/写属性。那就是您要响应更改的属性。

虽然您可以观察到该属性,但最简单的方法是覆盖子类中的 -setSelectedTextRange: 方法并在其中执行您需要的任何其他行为。 (根据您的特定设计,您可能想也可能不想确认范围实际上正在改变。)

【讨论】:

  • Doesn't seem to trigger when the selection changes due to typing, though.
【解决方案2】:

从iOS2开始UITextView的delegate()就符合这个

-(void)textViewDidChangeSelection:(UITextView *)textView {
    //read textView.selectedRange
}

我个人也喜欢在关闭键盘时手动触发它,因为我认为这也是一个选择更改,但不会自行触发委托回调(在我的拙见中忽略了 Apple 的部分)

-(void)textViewDidEndEditing:(UITextView *)textView {
    textView.selectedRange = NSMakeRange(0, 0);
    [self textViewDidChangeSelection:textView];
}

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2019-02-25
    • 2023-03-20
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多