2011-03-21 61 views
0

从一开始,我的UITextView可编辑属性为true不可编辑(通过NIB中的设置)。行为是这样的,用户可以选择和复制文本,但不能编辑。事情应该是这样的。UITextView setSelectedRange更改可编辑属性

但是,如果我拨打电话setSelectedRange,副作用是editable属性设置为YES。

将它重新设置为NO [textview setEditable:NO]将滚动到textView的底部并撤销我的编程选择。它也不起作用,因为无论如何都可以编辑。键盘出现和一切。

我需要能够以编程方式选择某些内容,并将textView保持在用户只能复制和选择文本的状态。

[textView select:self]; 
[textView setSelectedRange:selectedText]; 

我被卡住了。寻找任何建议,你可以给。

这不起作用:

[textView select:self]; 
[textView setSelectedRange:selectedText]; 
[textView setEditable:NO]; 

我也尝试设置委托功能textViewShouldBeginEditing返回NO:

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { 
    return NO; 
} 

这只是锁定都记录下来,我无法选择任何文本。

+0

这比我想象的还要糟糕。 setSelectedRange将可编辑设置为YES,将其编辑为YES,然后调用各种UITextView编辑委托。当用户选择文本时,这些都不会发生。我想模仿用户选择文本。 – RWP 2011-03-22 20:21:26

回答

0

这似乎为我类似情况的工作:

  • 只是让TextView的可编辑
  • [textView setDelegate:self];
  • [textView select:self];
  • [textView setSelectedRange:range];
  • 添加返回函数(BOOL)textView:shouldChangeTextInRange:replacementText:NO
  • 和最后三CK:分配一个空视图作为键盘TextView的使用:

textView.inputView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];

+0

这几乎是我所需要的。唯一的问题是,所有不可用的编辑命令都会使复制菜单变得更大,这也是一个用户界面禁止。所以最终的目标是劫持上下文/选择菜单。我会研究。如果您有任何想法,请告诉我。 – RWP 2011-03-24 17:48:29

+0

我将添加以下内容来禁用菜单: - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {UIMenuController sharedMenuController] .menuVisible = NO; return NO; }为了方便起见,我将重写下面的答案并将其标记为答案。 – RWP 2011-03-24 17:55:42

+0

确实如此,并且出于我的目的,我还发现了另一个问题,即阻止选择消失。我通过直接将选择重置为相关的didChangeSelection回调中的最后一个有效状态来解决它。 – mvds 2011-03-24 18:45:25

0

TextView的应该是编辑:

[textView setEditable:YES]; 

做的选择:

[textView select:self]; 
[textView setSelectedRange:range]; 

在代表中有这些:

要禁用菜单(不理想的我,但它的确定):

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{  
    [UIMenuController sharedMenuController].menuVisible = NO; 
    return NO;  
} 

要禁用键盘:

textView.inputView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; 

要禁用编辑:

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text { 
    return NO; 
} 
1

我知道这已经已被回答,但这是我为保持弹出式菜单所做的改进,只是禁用了某些选项;

-(BOOL) canPerformAction:(SEL)action withSender:(id)sender { 
    bool response = [super canPerformAction:action withSender:sender]; 
    if(response && (action == @selector(cut:) || action == @selector(paste:) || action == @selector(delete:) || action == @selector(_promptForReplace:))) { 
     return NO; 
    } 
    return response; 
} 

canPerformAction根据定义的动作被调用。调用父方法将处理大部分这些情况,但我也决定禁用剪切,粘贴,删除和拼写建议(_promptForReplace)。

+0

啊真棒。我正要试图弄清楚如何做到这一点。谢谢! – 2012-08-15 15:03:57

+0

我已经在所有的开发过程中使用了这个,但是当提交时,在应用程序评论过程中,Apple说_promptForReplace:是一个非公开的API。有人有类似的问题吗? – buttcmd 2015-08-04 11:36:55