代码之家  ›  专栏  ›  技术社区  ›  wkw

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

  •  12
  • wkw  · 技术社区  · 15 年前

    文本,但是

    1. 无闪烁光标
    2. 按键盘上的任意键可删除选择范围中的现有文本。

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

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

    我已经尝试过的一些东西:

    1. 在viewDidAppear中设置所选范围(而不是在TextViewDidBeginEdit中设置和)。
    2. [[_textView webView] selectAll]; (专用api)。同样的行为,文本在没有视觉反馈的情况下被选中。
    3. 使用performSelector。。。afterDelay设置selectedRange,使其在退出TextViewDidBegineEdit后发生。

    参考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);
     }
    }
    

    --编辑--
    以下是提交给苹果BugReporter的示例项目。 Download BugReport_7380723 sample project

    • 当选择了文本但没有突出显示时,轻触一些按键,然后“摇动以撤消”,原始文本就会恢复 但是是的 突出显示。

    • 以及 正确显示突出显示。

    4 回复  |  直到 6 年前
        1
  •  17
  •   Zac    14 年前

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

    [textView select:self];
    textView.selectedRange = newSelectedRange; 
    
        2
  •  4
  •   wkw    15 年前

    我现在会回答我自己的问题,等有更多信息时再更新(或者如果其他人找到合适的工作,我会很乐意把支票移到他们的答案上)。我有一个bug报告到苹果,在提交了示例代码之后,它的状态是开放的。我很有信心这是一个bug,所以当我得到他们的回复时,我会在这里传递。

        3
  •  1
  •   vtloc    12 年前

    突然遇到这个问题。在检查NSObject的declare头之前,我也遇到过同样的问题。他们已经提供了一个名为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
    
        4
  •  0
  •   Community CDub    8 年前