UITextView 中未显示光标

有人能想到一个原因,闪烁的光标不会显示在一个 UITextView?我有一个自定义控件,它只是 UIView的一个子类,其中包含一个 UITextView,但是当它获得焦点时,光标不会出现。键盘出现了,文本在你键入时出现,但是没有光标,我不知道为什么。

有什么想法吗。

35194 次浏览

您可能已经更改了自定义 UITextView 中的色彩。如果色彩与背景颜色(通常是白色)相同,那么它将看起来是不可见的。

您可能不正确地为组件设置了 contentSize和/或帧,因此它太小而不可见,或者控件不在屏幕上。请进入模拟器到 Debug->Color Blended Layers查看这些值是否设置正确。

编辑:

使用新的 Xcode (可能是在 Xcode 6中引入的) ,您可以通过单击“ Debug 视图层次结构”(它是底部栏中的图标之一)来调试这类问题

我更改了所有 UITextView 的色彩,光标在下一次构建时开始显示。

文本字段正在显示光标,但是您无法看到颜色,只是因为您的文本字段的色彩被设置为默认颜色,很可能就像在我的案例中一样。 只需在故事板中选择您的 textField 并选择您希望的链接颜色。请参考附加的图像。

enter image description here

简单的解决方案似乎可以通过引入延迟,然后调用 firstResponder 来实现,像这样:

-(void)begin{


[self performSelector:@selector(first) withObject:nil afterDelay:0.01f];
}
-(void)first{


[tf becomeFirstResponder];
}

在我的例子中,我在 viewDidLoad方法中调用了 becomeFirstResponder。我把电话转到 viewDidAppear,它对我很有用。

上述解决方案在我的情况下不起作用。在我的例子中的问题是,当 UITableViewCellselectionStyle不是 none时,作为游标的 UIViewisOpaque设置为 false。这似乎只发生在比赛条件下,我还没有得到的底部。

FWIW 我是这样调试的:

  1. 选择你的 UITextFieldView
  2. 打开调试视图层次结构。您应该会看到代表光标的 UIView处于正确的位置,但是它并没有出现在 UI 中。
  3. 右键单击光标的 UIView并选择“打印描述...”。描述指示 OPAQUE=NO

不幸的是,拥有这个 UIViewUITextSelectionView类是私有的,因此没有通过编程方式更新 isOpaque的非专用方法。

这似乎不是每个实现中都存在的问题,然而,下面是我的观点之间的关系。

我的文本视图委托

extension FooViewController: UITextViewDelegate {
private func updateSelection(selectedIndex indexPath: IndexPath) {
if let oldSelected = self.table.indexPathForSelectedRow {
tableDelegate.tableView(table, didDeselectRowAt: oldSelected)
}
tableDelegate.tableView(table, didSelectRowAt: indexPath)
}


func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
guard let rowCell = getParentCell(forTextView: textView), // loops through table row cells
!rowCell.isSelected,
let indexPath = self.table.indexPath(for: rowCell)
else { return true }


updateSelection(selectedIndex: indexPath)
return false
}

还有我的代表:

class TableViewDelegate: NSObject, UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableView.ScrollPosition.none)
}
}

对我来说,这个问题是由于在 UIToolbar中嵌入了一个 UITextField引起的。一旦我将容器替换为简单的 UIView,光标就会再次工作。

对我来说,它不是 tintColor,它是由覆盖 caretRect 方法引起的

open override func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}

为我提供了一个可以工作的拐杖:

   DispatchQueue.main.async {
           

self.textView.becomeFirstResponder()
self.textView.insertText(" ")
self.textView.deleteBackward()
}