以编程方式设置时不显示 UITextView selectedRange

Posted

技术标签:

【中文标题】以编程方式设置时不显示 UITextView selectedRange【英文标题】:UITextView selectedRange not displaying when set programmatically 【发布时间】:2010-12-15 01:58:29 【问题描述】:

我的问题是以编程方式设置 UITextView 的 selectedRange 选择文本,但 直观地表明它已被选中。这听起来像 OS 3.0/3.1 中的错误吗?更重要的是,有什么解决方案或建议可以让选择显示? (示例项目链接在消息底部)

我没有收到视觉反馈,我怎么知道它已被选中?两个原因:

    没有闪烁的光标 点击键盘上的任意键会删除选择范围内的现有文本。

我在视图控制器中有一个 UITextView,它允许编辑用户可更改的值。当在表格行上接收到双击时打开编辑器控制器,或者用户在行上点击详细信息披露按钮。 viewcontroller通过presentModalViewController到达,在编辑器VC的viewWillAppear方法中,我用[self.textView becomeFirstResponder];启动键盘

有时我想启动编辑器并选择 textview 的全部内容,这样用户就可以简单地开始输入,它会删除现有的内容(这是因为我创建了具有默认标题的新项目,所以几乎可以确定用户将首先删除编辑器文本字段的全部内容,然后键入它们的标题)。

我已经尝试过的一些事情:

    在 viewDidAppear 中设置选定范围(而不是在 textViewDidBeginEditing 中设置)。 将 _textView.text 替换为其中的文本副本,然后应用 selectedRange(在 textViewDidBeginEditing 中)...想如果我正在处理框架错误,这可能会解决它。 [[_textView webView] selectAll];(私有 API)。同样的行为,选择文本时没有视觉反馈。 发送 _textView setNeedsDisplay 和 setNeedsLayout。 使用 performSelector ... afterDelay 设置 selectedRange 以便在退出 textViewDidBeginEditing 后发生。

参考 S.O.: Here 和 here

// UITextFieldDelegate Methods...
- (void)textViewDidBeginEditing:(UITextView *)_textView

 NSInteger len = [_textView.text length];

 if( self.selectInitialText )
  //NOTE: this is not working as expected. Indeed the text is 
  // selected but the highlighting of the text isn't showing.
  _textView.selectedRange = NSMakeRange(0,len);
 

-- 编辑-- 这是提交给 Apple BugReporter 的示例项目。 Download BugReport_7380723 sample project

其他信息:

在创建和使用示例项目提交时,我发现了两件事:

When there's text selected but no highlight displayed, tap some keystrokes then "shake to undo" and the original text is restored but IS highlighted.

如果您在文本视图中手动进行选择,然后点击“全选”按钮[参考上面链接的示例项目],所有文本都被选中并且正确显示突出显示.

【问题讨论】:

【参考方案1】:

突然遇到这个问题。在我检查 NSObject 的声明头之前,我遇到了同样的问题。他们已经提供了一个名为 selectAll 的函数:

@interface NSObject(UIResponderStandardEditActions)   // these methods are not implemented in NSObject

- (void)cut:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)copy:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)paste:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)select:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)selectAll:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)delete:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2);

@end

【讨论】:

【参考方案2】:

在以编程方式在 textView 上设置选择之前,只需调用 select 以使其直观地显示新选择。例如:

[textView select:self];
textView.selectedRange = newSelectedRange; 

【讨论】:

这行得通。在 setSelectedRange 之前调用 select 会使蓝色背景和“棒棒糖”可见。省略 select 调用将导致文本被选中,但没有选择指示符【参考方案3】:

我现在会回答我自己的问题,稍后在有更多信息时更新它(或者如果其他人找到合适的解决方法,我会很乐意将检查移至他们的答案)。我收到了苹果的错误报告,在提交示例代码后,它以打开状态坐在那里。我很确定这是一个错误,所以当我得到他们的回复时,我会在这里传递。

【讨论】:

我正在选择@Zac 的答案,因为至少有其他人似乎已经证实了这一点,但我自己还没有机会进行测试。【参考方案4】:

解决方法:您似乎想要的是 UITextView 占位符功能。这当然不存在。但是,有一些解决方法here

【讨论】:

感谢您的解决方法建议。但在这种情况下,它真的不是占位符。我有一个具有特定可编辑“标题”的实体;当字段“打开”进行编辑时,占位符会消失。我的文本应该保留但表明它已被选中,因此键盘操作将替换选择,或者他们需要在字段中点击以终止选择。此外,任何类型的支持选择的小部件都应指示选定状态,因此这可能是一个错误(我在此处发布后立即提交了错误报告)。我对显示选择的解决方法更感兴趣。谢谢。

以上是关于以编程方式设置时不显示 UITextView selectedRange的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 以编程方式调整大小,但随后设置为旧的故事板值。

我将如何(以编程方式)将 UITextView 的高度设置为其在 Swift 中的内容大小?

Swift - 以编程方式居中 UITextView

Swift 3:UITextView - 动态高度 - 以编程方式

以编程方式添加多个 UITextView

在 UITextView 上以编程方式禁用 iOS8 Quicktype 键盘