UITextView中光标不显示

73

有人能想到为什么在UITextView中闪烁的光标不会出现吗? 我有一个自定义控件,它只是UIView的子类,并且其中包含一个UITextView,但在获取焦点时光标不会出现。 键盘出现并且随着你的输入文本也会出现,但是没有光标,我无法弄清楚原因。

有什么想法吗?...


这个 TextView 是 UITextView 还是 UITextView 的子类? - Hetal Vora
TextView只是一个标准的UITextView,没有子类和自定义行为。 - SeanT
在iOS 7中,我看到模拟器中的光标在用户打字时错位到了导航栏。但这个问题在实际设备上并不存在。你的问题也是在设备上出现吗? - bilobatum
11个回答

230

你可能已经更改了自定义UITextView中的色调颜色。如果色调颜色与背景颜色相同(通常为白色),那么它将会看起来是透明的。


这是一个不错的想法,但它只是一个标准的白色UITextView,并且未更改着色颜色。 - SeanT
2
它同样适用于UITextField。 - Lukasz
我也遇到过这种情况,当另一个开发人员更改了图标色调时,在另一个视图中。我不知道为什么,当我回到我的视图时光标被隐藏了。我需要在程序中重新设置视图出现的色调。 - Apan
在Storyboard中,遇到了默认色调设置问题。将其设置为其他颜色,再恢复默认值即可使光标出现。此外,在调试视图层次结构会话中,它会有一些可见性。 - Dren
这似乎是问题所在。色调颜色被设置为“默认”,即蓝色,但我认为它显示为白色,这也出现在其他控件中。我在IB中将其更改为红色,它显示为红色。然后我将其更改为蓝色,而不是“默认”,最终它显示为蓝色。 - SeanT
如果您想让光标的颜色与色调颜色(按钮)不同,请查看我在这里发布的答案:https://dev59.com/G2Ei5IYBdhLWcg3wPadh#42444940 - Derek Soike

9
您可能设置组件的contentSize和/或框架不当,因此它太小而无法显示,或者控件超出屏幕。请在模拟器中前往Debug->Color Blended Layers以查看这些值是否设置正确。
编辑:
使用新版Xcode(可能是Xcode 6中引入的)可以通过单击“调试视图层次结构”(它是底部栏上的图标之一)来调试此类问题。

3
这并没有回答问题。如果想对作者进行评论或请求澄清,请在他们的帖子下留言。 - Pierre-Luc Pineault
7
作者希望得到一些关于为什么看不到光标的想法,我的想法是整个组件或部分组件(其中一个属性)的框架可能设置不当。这可能会解决他的问题,因为实际上可能是他的问题。他没有提供任何代码片段,所以我们只能基于已知知识进行猜测。如果您仍然感觉我没有回答,请建议我修改 :) - Julian
这帮助我看到了背景颜色的问题。 - divergio

4
文本框正在显示光标,但您无法看到颜色,只是因为您的文本字段的色调颜色可能设置为默认值,就像在我的情况下一样。只需在Storyboard中选择您的textField并选择您喜欢的链接颜色。请参考附图。

enter image description here

3

我更改了所有UITextView的色调颜色,下一个构建中光标开始显示。


2
it should be comment. - Syeda Zunaira

1

简单的解决方法是通过引入延迟,然后调用firstResponder来解决问题,像这样:

-(void)begin{

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

    [tf becomeFirstResponder];
}

1
一个对我有帮助的工具:
   DispatchQueue.main.async {
           
      self.textView.becomeFirstResponder()
      self.textView.insertText(" ")
      self.textView.deleteBackward()
 }

1
在我的情况下,我在viewDidLoad方法中调用了becomeFirstResponder。我将这个调用移到了viewDidAppear中,这样它就对我起作用了。

0

我也遇到了同样的问题,尝试了给出的答案,但无法在textview中看到光标。 因为其他原因导致了这个问题。 所以如果你像我一样遇到了不常见的问题,这将对你有所帮助。

我有一个被覆盖的方法,它导致了光标可见性问题

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

所以我只是注释掉了这些行,对我来说它运行得很好


0

对我来说,问题不在于tintColor,而是由于覆盖了caretRect方法所导致的。删除这个方法解决了我的问题。

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

0

以上的解决方案在我的情况下没有起作用。在我的情况下,问题是当UITableViewCellselectionStyle不是none时,充当光标的UIViewisOpaque设置为false。这似乎只会在我还没有完全弄清楚的竞争条件下发生。

以下是我如何调试此问题的方法:

  1. 选择您的UITextFieldView
  2. 打开Debug View Hierarchy。您应该看到代表光标的UIView处于正确的位置,但它不会出现在UI中。
  3. 右键单击光标的UIView,然后选择“Print Description...”。描述指示OPAQUE=NO

不幸的是,拥有此UIViewUITextSelectionView类是私有的,因此没有非hacky的方法可以编程方式更新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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接