光标未显示在 UITextView
Posted
技术标签:
【中文标题】光标未显示在 UITextView【英文标题】:Cursor not showing up in UITextView 【发布时间】:2014-01-06 21:10:03 【问题描述】:谁能想到闪烁光标不会出现在UITextView
中的原因?我有一个自定义控件,它只是UIView
的子类,其中有一个UITextView
,但是当它获得焦点时光标不会出现。出现键盘,键入时出现文本,但没有光标,我不知道为什么。
有什么想法吗?...
【问题讨论】:
textview 是 UITextView 还是 UITextView 的子类? textview 只是一个标准的 UITextView。不是子类,也没有自定义行为。 在 ios 7 中,我看到在用户键入时光标错放在模拟器中的导航栏上。该问题在设备上消失了。您的问题是否出现在设备上? 【参考方案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】:上述解决方案不适用于我的情况。在我的例子中,问题是当UITableViewCell
的selectionStyle
不是none
时,充当光标的UIView
将isOpaque
设置为false
。这似乎只发生在我还没有深究的竞争条件下。
FWIW 我是这样调试的:
-
选择您的
UITextFieldView
打开调试视图层次结构。您应该会看到 UIView
代表光标处于正确位置,但它不会出现在 UI 中。
右键单击光标的UIView
并选择“打印说明...”。描述表明OPAQUE=NO
不幸的是,拥有这个UIView
的UITextSelectionView
类是私有的,因此没有非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()
【讨论】:
以上是关于光标未显示在 UITextView的主要内容,如果未能解决你的问题,请参考以下文章
AppcompatEditText 未显示 android:textCursorDrawable="@null" 和自定义背景集的光标