【问题标题】:Cursor not showing up in UITextView光标未显示在 UITextView
【发布时间】:2014-01-06 21:10:03
【问题描述】:

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

有什么想法吗?...

【问题讨论】:

  • textview 是 UITextView 还是 UITextView 的子类?
  • textview 只是一个标准的 UITextView。不是子类,也没有自定义行为。
  • 在 iOS 7 中,我看到在用户键入时光标错放在模拟器中的导航栏上。该问题在设备上消失了。您的问题是否出现在设备上?

标签: ios iphone ipad uitextfield uitextview


【解决方案1】:

您可能已经更改了自定义 UITextView 中的色调颜色。如果色调颜色与背景颜色相同(通常为白色),则它会显得不可见。

【讨论】:

  • 这个想法不错,但只是标准的白色UITextView,而且tint颜色没有改变。
  • 同样适用于 UITextField
  • 我也遇到了这样的情况,在另一个视图中,其他开发人员更改了色调。我不知道为什么,当我回到我的视图时,光标被隐藏了。我需要在视图中重新设置色调将以编程方式显示。
  • 在情节提要中将色调颜色设置为默认值时遇到了这个问题。设置另一种颜色,默认返回光标出现。由于调试视图层次结构会话,它也有点可见
  • 这似乎是问题所在。色调颜色设置为“默认”,即蓝色,但我认为它显示为白色,我在其他控件中注意到了这一点。我在 IB 中将其更改为红色,它显示为红色。然后我把它改成蓝色,而不是“默认”,它最终显示为蓝色。
【解决方案2】:

您可能为组件设置了不正确的contentSize 和/或框架,因此它太小而无法看到或控件不在屏幕上。请在模拟器中到Debug->Color Blended Layers查看这些值是否设置正确。

编辑:

使用新的 Xcode(可能在 Xcode 6 中引入),您可以通过单击“Debug View Hierarchy”(它是底部栏上的图标之一)来调试此类问题

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • 作者想知道为什么他看不到光标的原因,所以我的想法是整个组件或其一部分(属性之一)的框架可能设置不当。这可以解决他的问题,因为这实际上可能是他的问题。他没有提供任何代码片段,所以我们只能根据知识猜测。如果您仍然觉得我没有回答,请建议我进行编辑:)
  • 这帮助我看到了背景颜色问题。
【解决方案3】:

文本字段正在显示光标,但您看不到颜色,只是因为您的文本字段的色调设置为默认值,很可能就像我的情况一样。 只需在情节提要中选择您的 textField 并选择您希望的链接颜色。参考附图。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 应该是评论。
    【解决方案5】:

    通过引入延迟然后调用 firstResponder 似乎可以实现简单的解决方法,如下所示:

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

    【讨论】:

      【解决方案6】:

      就我而言,我在viewDidLoad 方法中调用了becomeFirstResponder。我把电话转到viewDidAppear,它对我有用。

      【讨论】:

        【解决方案7】:

        对我来说,问题是由在 UIToolbar 中嵌入 UITextField 引起的。将容器替换为简单的UIView 后,光标再次工作。

        【讨论】:

          【解决方案8】:

          上述解决方案不适用于我的情况。在我的例子中,问题是当UITableViewCellselectionStyle 不是none 时,充当光标的UIViewisOpaque 设置为false。这似乎只发生在我还没有深究的竞争条件下。

          FWIW 我是这样调试的:

          1. 选择您的UITextFieldView
          2. 打开调试视图层次结构。您应该会看到 UIView 代表光标处于正确位置,但它不会出现在 UI 中。
          3. 右键单击光标的UIView 并选择“打印说明...”。描述表明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)
              }
          }
          

          【讨论】:

            【解决方案9】:

            对我来说,这不是 tintColor,它是由覆盖 caretRect 方法引起的。删除此方法解决了我的情况

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

            【讨论】:

              【解决方案10】:

              我的工作拐杖:

                 DispatchQueue.main.async {
                         
                    self.textView.becomeFirstResponder()
                    self.textView.insertText(" ")
                    self.textView.deleteBackward()
               }
              

              【讨论】:

                猜你喜欢
                • 2018-05-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-09-22
                • 2017-09-24
                • 2021-03-02
                • 2012-07-16
                • 2013-05-24
                相关资源
                最近更新 更多