98


42

`UITextView`のコピー、切り取り、選択、すべて選択の機能は私がスクリーンを押し下げるとデフォルトで表示されます。 しかし、私のプロジェクトでは `UITextField`は読み取り専用です。 この機能は必要ありません。 この機能を無効にする方法を教えてください。

28 Answer


95


ペーストボード操作を無効にする最も簡単な方法は、許可したくないアクションに対して NO`を返す canPerformAction:withSender: メソッドをオーバーライドする UITextView`のサブクラスを作成することです:

-  (BOOL)canPerformAction:(SEL)アクションwithSender:(id)送信者{if(action == @selector(paste :))}はNOを返します。 [super canPerformAction:action withSender:sender]を返します。 }

UIResponder~も参照してください


67


UITextViewをサブクラス化し、canBecomeFirstResponderを上書きします。

-  (BOOL)canBecomeFirstResponder {NOを返します。 }

これは編集不可能なUITextViewにのみ適用されることに注意してください。 編集可能なものでそれをテストしていません…​


30


あなたのアプリケーションの* all * `UITextView`で切り取り/コピー/貼り付けを無効にしたい場合は、_category_を使用することができます。

@implementation UITextView(DisableCopyPaste)

-  (BOOL)canBecomeFirstResponder {NOを返します。 }

@終わり

それはサブクラスを節約します…​ :-)


29


これは私にとって最良の解決策でした。

UIView * overlay = [[UIView alloc] init];
[overlay setFrame:CGRectMake(0, 0, myTextView.contentSize.width, myTextView.contentSize.height)]
;
[myTextView addSubview:overlay]
;
[overlay release]
;

から:https://stackoverflow.com/a/5704584/1293949


21


UITextViewをスクロールする必要がない場合は、サブクラス化を含まない最も簡単な解決策は、テキストビューに対するユーザー操作を無効にすることです。

textField.userInteractionEnabled = NO;


15


最も簡単な方法は、canPerformAction:withSenderをオーバーライドするUITextViewのサブクラスを作成することです。

-  (BOOL)canPerformAction:(SEL)アクションwithSender:(id)送信者{[UIMenuController sharedMenuController] .menuVisible = NO; //メニューを表示しない[self resignFirstResponder]; //ユーザーに選択を許可しない}


15


@ rpetrichの答えは私のために働きました。 時間を節約するために、拡張コードを掲載しています。

私の場合、ポップアップをまったく表示したくありませんが、UITextFieldを最初のレスポンダにすることはできます。

残念ながら、テキストフィールドをタップアンドホールドしても、拡大鏡のポップアップが表示されます。

@interface NoSelectTextField:UITextField

@終わり

@implementation NoSelectTextField

-  (BOOL)canPerformAction:(SEL)アクションwithSender:(id)送信者{if(アクション== @selector(ペースト:) ||アクション== @selector(カット:) ||アクション== @selector(コピー:) | | action == @selector(select :) || action == @selector(selectAll :) || action == @selector(delete :) || action == @selector(makeTextWritingDirectionLeftToRight :) || action == @selector (makeTextWritingDirectionRightToLeft :) ||アクション== @selector(toggleBoldface :) ||アクション== @selector(toggleItalics :) ||アクション== @selector(toggleUnderline :)){return NO; [super canPerformAction:action withSender:sender]を返します。 }

@終わり

*スウィフト4 *

クラスNoSelectTextField:UITextField {

func canPerformActionをオーバーライドします(_ action:Selector、withSender差出人:Any?) - > Bool {if action == #selector(paste(_ :))|| action == #selector(cut(_ :))|| action == #selector(copy(_ :))|| action == #selector(select(_ :))|| action == #selector(selectAll(_ :))|| action == #selector(delete(_ :))|| action == #selector(makeTextWritingDirectionLeftToRight(_ :))|| action == #selector(makeTextWritingDirectionRightToLeft(_ :))|| action == #selector(toggleBoldface(_ :))|| action == #selector(toggleItalics(_ :))|| action == #selector(toggleUnderline(_ :)){return false} return super.canPerformAction(action、withSender:sender)}

}


13


iOS 7のcanPerformActionにNOを返すと、次のようなエラーが多数発生します。

`:CGContextSetFillColorWithColor:無効なコンテキスト0x0。 これは重大なエラーです。 このアプリケーション、またはそれが使用するライブラリは無効なコンテキストを使用しているため、システムの安定性と信頼性が全体的に低下しています。 この通知は礼儀です。この問題を解決してください。 それは今後のアップデートでは致命的なエラーになります。

私の解決策は次のとおりです。

-  (BOOL)canPerformAction:(SEL)アクションwithSender:(id)sender {[[NSOperationQueue mainQueue] addOperationWithBlock:^ {[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO]; ;]]; [super canPerformAction:action withSender:sender]を返します。 }

トリックは、メインキューの次のサイクルで(表示された直後に)メニューコントローラを隠すことです。


10


これは、UITextViewでメニュー全体を選択/コピー/貼り付けを無効にする最も簡単な方法です。

 - (BOOL)canPerformAction:(SEL)アクションwithSender:(id)送信者{[UIMenuController sharedMenuController] .menuVisible = NO; NOを返します。 }


4


iOS 7以降、UITextViewにプロパティがあります。

@property(nonatomic、getter = isSelectable)BOOL選択可能。

これは、ビューがテキスト選択を許可しないようにします。 私にとっては素晴らしい作品です。