2009-10-28 83 views
36

可能重复:
How disable Copy, Cut, Select, Select All in UITextViewUITextView中禁用文本选择

我有一个很难得到UITextView禁用文本的选择。

我已经试过:

canCancelContentTouches = YES; 

我试过子类和覆盖:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 

(但被调用后,才选择)

- (BOOL)touchesShouldCancelInContentView:(UIView *)view; 

(我根本没有看到被解雇)

- (BOOL)touchesShouldBegin:(NSSet *)touches 
       withEvent:(UIEvent *)event 
      inContentView:(UIView *)view; 

(我没有看到,越来越要么解雇)

我缺少什么?

+2

因为它是不可能的答案添加到这一点:注意这里的最佳答案(恕我直言)实际上是由亚历山大评论:自iOS 7有一个@属性(非原子,getter = isSelectable)BOOL可选择NS_AVAILABLE_IOS(7_0) – Epaga 2014-02-23 17:14:41

+0

我得到了问题重新打开,并添加了sele ctable'作为正确答案。好极了! – 2016-02-11 20:34:53

回答

73

问题How disable Copy, Cut, Select, Select All in UITextView有一个可行的解决方案,这一点,我刚刚实现和验证:

子类UITextView并覆盖canBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder { 
    return NO; 
} 

需要注意的是日是禁用链接和其他可点击的文本内容。

+4

这个答案应该被接受为imho。 – Craimasjien 2011-12-21 10:43:08

+0

谢谢,它符合我的需求。 – masgar 2012-09-12 09:57:14

+0

James M的答案效果更好。 – jowie 2012-10-01 15:41:29

5

如果您只是想防止它被编辑,然后将UITextView的“可编辑”属性设置为NO/False。

如果你想让它变得可编辑但不可选,那会很棘手。您可能需要创建用户可以键入的隐藏文本视图,然后让UITextView观察隐藏的文本视图并使用文本视图的文本填充自己。

+1

我不希望它是可编辑或可选的。 – dizy 2009-10-28 19:48:30

+0

你需要它滚动吗? – TechZen 2009-10-28 20:24:18

+1

是的,我需要它滚动。 – dizy 2009-10-28 20:31:33

1

你有没有尝试为你的UITextView设置userInteractionEnabled为NO?但是你也会失去滚动。

如果你需要滚动,这可能是你使用UITextView而不是UILabel的原因,那么你需要做更多的工作。你可能不得不重写canPerformAction:withSender:回到NO不要为您不想让操作:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    switch (action) { 
     case @selector(paste:): 
     case @selector(copy:): 
     case @selector(cut:): 
     case @selector(cut:): 
     case @selector(select:): 
     case @selector(selectAll:): 
     return NO; 
    } 
    return [super canPerformAction:action withSender:sender]; 
} 

如需更多信息,UIResponderStandardEditActions

+1

我提到我已经尝试过了:)直到做出选择之后,canPerform才会被调用 – dizy 2009-10-29 04:06:57

+0

Downvote:这不会阻止切割/复制/定义工具栏出现 - 此页面上列出了更好的解决方案。 – Gerard 2016-03-29 10:00:00

9

听起来像你真正想要的是一个UIScrollView中的巨大UILabel,而不是UITextView。

更新:如果你是iOS上的UILabel的新版本现在有一个行属性:

Multiple lines of text in UILabel

+1

是的,我想。如果我不明白这一点,将会成为下一件事。 – dizy 2009-10-28 21:06:32

+0

thanx伙计,我不知道dizy,但我实际上需要一个UILabel。 – 2011-03-10 12:50:48

+0

UILabel将防止换行符。你想要一个没有启用用户交互的UITextView,然后你想要在UIScrollView里面。 或者,您可以在UIWebView中的textView中显示透明的UIWebView(只需使用loadHTML将文本/代码导入到UIWebView中(包括使背景透明的CSS代码),然后您就可以使用JavaScript来制作它不可选择但仍可滚动)。 – 2013-05-01 16:18:16

45

我发现,调用

[textView setUserInteractionEnabled:NO]; 

工作得很好。

+26

这也将禁用UITextView上的滚动功能 – 2011-12-30 19:56:57

+10

并禁用单击链接的能力 – barfoon 2012-02-09 22:09:43

+2

我使用uitextview作为自定义的uitableviewcell中的子视图。 它像梦一样工作 – 2012-08-17 11:36:38

7

UITextViewselectable属性:

此属性控制用户的选择内容和 与URL和文本附件交互的能力。默认值是YES。

1

要做到这一点首先子类UITextView的

,并在执行请执行下列操作

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event 
{ 
    self.selectable = NO; 
} 

- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event 
{ 
     self.selectable = YES; 
} 

这应该做工精细,