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

时间:2009-11-10 15:01:59

标签: iphone cocoa-touch uitextview iphone-sdk-3.1

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

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

  1. 没有闪烁的光标
  2. 点击键盘上的任意键可删除选择范围内的现有文本。
  3. 我在viewcontroller中有一个UITextView,它允许编辑用户可更改的值。当在表格行上接收到双击时,或者用户点击一行上的详细信息公开按钮时,将打开编辑器控制器。 viewcontroller通过presentModalViewController到达,在编辑器VC的viewWillAppear方法中,我使用[self.textView becomeFirstResponder];启动键盘

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

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

    1. 在viewDidAppear中设置所选范围(而不是在textViewDidBeginEditing中执行此操作)。
    2. 将_textView.text替换为其中的文本副本,然后应用selectedRange(在textViewDidBeginEditing中)...想想也许如果我正在处理框架错误,这可能会解决它。
    3. [[_textView webView] selectAll];(私人api)。相同的行为,文本被选中,没有视觉反馈。
    4. 发送_textView setNeedsDisplay和setNeedsLayout。
    5. 使用performSelector ... afterDelay设置selectedRange,以便在退出textViewDidBeginEditing后发生。
    6. 参考S.O。: Herehere

      // 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

      其他信息:

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

      • 当选择了文字但未显示突出显示时,点按一些按键,然后“摇动撤消”,原始文字将恢复,但

      • 突出显示。

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

4 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:4)

我现在将回答我自己的问题,并在有更多信息时更新它(或者如果其他人找到合适的工作,我会乐意将支票移到他们的答案)。我有一个关于苹果的错误报告,在提交示例代码之后,它处于打开状态。我非常有信心这是一个错误,所以当我收到他们的回复时,我会在这里传递。

答案 2 :(得分: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

答案 3 :(得分:0)

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