2009-10-28 164 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; 
} 

這應該做工精細,