UITextView根据需求实现UITextField的placeholder效果,我通过添加默认提示文字并修改文字的颜色,监听键盘弹出时,修改光标定位
- (void)keyBordWillShow:(NSNotification *)note
{ //在最上层避免被挡住
[self.view bringSubviewToFront:self.recommedTextView];
//如果是备注提示内容,则光标定位在第一位
if ([self.recommedTextView.text isEqualToString:NSLocalizedString(@"remark_content", nil)]) {
self.recommedTextView.selectedRange = NSMakeRange(0,
0);
}
}
可是实现时候发现只有第一次进来的时候光标会在首位,查看日志,发现错误消息:
[Common] _BSMachError: port 80cb; (os/kern) invalid capability (0x14) "Unable to insert COPY_SEND"
[Common] _BSMachError: port 80cb; (os/kern) invalid name (0xf) "Unable to deallocate send right"
查询了解决方案之后,需要在主线程上修改光标定位,但是我比较疑惑的我设置断点调试,本来就是在主线程上的,为什么还需要再次回到主线程:
- (void)keyBordWillShow:(NSNotification *)note
{ //在最上层避免被挡住
[self.view bringSubviewToFront:self.recommedTextView];
//如果是备注提示内容,则光标定位在第一位
if ([self.recommedTextView.text isEqualToString:NSLocalizedString(@"remark_content", nil)]) {
//在主线程中修改
dispatch_async(dispatch_get_main_queue(), ^{
self.recommedTextView.selectedRange = NSMakeRange(0,
0);
});
}
}
网友评论