以编程方式设置时不显示 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 中的内容大小?