UITextView setSelectedRange 问题

UITextView setSelectedRange issue

我已将 UITextView 子类化,目的是引入 placeholder 功能。它大部分运行良好,但当 UITextView 通过用户点击或调用 becomeFirstResponder 激活时,我遇到了问题。下面是每当触发 UITextViewTextDidBeginEditingNotification 通知时调用的自定义方法。

- (void)textViewSelected {

    if ([self.text isEqualToString:self.placeholder]) {

        NSLog(@"a %@", NSStringFromRange(self.selectedRange));
        self.selectedRange = NSMakeRange(0, 0);
        NSLog(@"b %@", NSStringFromRange(self.selectedRange));
    }
}

控制台记录此

a {16, 0}
b {0, 0}

但是光标还在闪烁

我什至尝试子类化 the setSelectedRange: 方法来检查在我的方法调用后是否设置了范围

- (void)setSelectedRange:(NSRange)selectedRange {

    NSLog(@"aa %@", NSStringFromRange(self.selectedRange));
    [super setSelectedRange:selectedRange];
    NSLog(@"bb %@", NSStringFromRange(self.selectedRange));
}

但是结果如下:

a {16, 0}
aa {16, 0}
bb {0, 0}
b {0, 0}

这意味着光标应位于索引 0。

有人知道这里出了什么问题吗?

我无法弄清楚为什么 NSMakeRange(0, 0) 不起作用,但我最终通过延迟调用 NSMakeRange(0, 0) 解决了我的问题,如下所示:

[self performSelector:@selector(placeMarkerInTheBeginning) withObject:nil afterDelay:0.01];

- (void)placeMarkerInTheBeginning {

    self.selectedRange = NSMakeRange(0, 0);
}

希望这对某人有所帮助。