Как отключить параметр копирования пасты из UITextField программно
Я делаю регистрационное предупреждение, в котором есть UITextField, где пользователь может ввести свой регистрационный номер. все в значительной степени их, однако я хотел бы удалить функцию copy paste из текстового поля программно, так как их версия InterfaceBuilder для текстового поля я не знаю, как это сделать.
Вот мой UIalertview до сих пор...
- (void)pleaseRegisterDevice {
UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Please Register Device!" message:@"this gets covered" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
regTextField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 45.0, 260.0, 25.0)];
[regTextField setBackgroundColor:[UIColor whiteColor]];
regTextField.textAlignment = UITextAlignmentCenter;
[myAlertView addSubview:regTextField];
[myAlertView show];
[myAlertView release];
}
Ответы
Ответ 1
В этом посте есть много приятных решений: Как отключить Копировать, Вырезать, Выбрать, Выбрать все в UITextView
Моим любимым является переопределение canPerformAction:withSender:
:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(paste:))
return NO;
return [super canPerformAction:action withSender:sender];
}
Ответ 2
Для iOS8.0 +, Xcode 6.0.1, ARC включен
В надежде сохранить новичка, как и я, некоторое время, реализуя это...
Чтобы реализовать отключение копирования/вставки/вырезания/etc. вы должны подклассифицировать UITextField и переопределить...
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
Чтобы сделать это...
Создайте новый класс, который является подклассом UITextField (т.е. новые файлы .h и .m, которые будут включены в папку вашего приложения). Итак, File- > New → "Cocoa Touch Class" → Далее → "PasteOnlyUITextField" (например), подкласс "UITextField" → Next- > Create.
Как только файлы .h и .m создаются для нашего нового подкласса UITextField, называемого "PasteOnlyUITextField"...
PasteOnlyUITextField.h
#import <UIKit/UIKit.h>
@interface PasteOnlyUITextField : UITextField
@end
PasteOnlyUITextField.m
#import "PasteOnlyUITextField.h"
@implementation PasteOnlyUITextField
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(paste:))
{
return true;
}
return false;
}
@end
Теперь убедитесь, что вы импортируете PasteOnlyUITextField.h, где вы собираетесь его использовать, например. Файл YourUIViewController.h...
#import "PasteOnlyUITextField.h"
Теперь вы должны использовать подкласс либо прогромно, либо с помощью инспектора личности
PasteOnlyUITextField *pasteOnlyUITextField = [[PasteOnlyUITextField alloc] init...];
или...
Выберите UITextField и перейдите к инспектору идентификации, выберите его класс.
![identity inspector]()
Вы можете изменить логику, связанную с параметрами меню, как вам удобно...
Надеюсь, это поможет! Спасибо всем оригинальным вкладчикам.
Ответ 3
Я нашел способ с быстрым использованием расширения и связанного объекта без подкласса.
Я использую свойство readonly для отключения пасты/вырезания, но этот образец можно адаптировать.
Swift 3 обновлено с 27/11/2016
var key: Void?
class UITextFieldAdditions: NSObject {
var readonly: Bool = false
}
extension UITextField {
var readonly: Bool {
get {
return self.getAdditions().readonly
} set {
self.getAdditions().readonly = newValue
}
}
private func getAdditions() -> UITextFieldAdditions {
var additions = objc_getAssociatedObject(self, &key) as? UITextFieldAdditions
if additions == nil {
additions = UITextFieldAdditions()
objc_setAssociatedObject(self, &key, additions!, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
return additions!
}
open override func target(forAction action: Selector, withSender sender: Any?) -> Any? {
if ((action == #selector(UIResponderStandardEditActions.paste(_:)) || (action == #selector(UIResponderStandardEditActions.cut(_:)))) && self.readonly) {
return nil
}
return super.target(forAction: action, withSender: sender)
}
}
Другой Swift (2.2)
import UIKit
var key: Void?
class UITextFieldAdditions: NSObject {
var readonly: Bool = false
}
extension UITextField {
var readonly: Bool {
get {
return self.getAdditions().readonly
}
set {
self.getAdditions().readonly = newValue
}
}
private func getAdditions() -> UITextFieldAdditions {
var additions = objc_getAssociatedObject(self, &key) as? UITextFieldAdditions
if additions == nil {
additions = UITextFieldAdditions()
objc_setAssociatedObject(self, &key, additions!, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}
return additions!
}
public override func targetForAction(action: Selector, withSender sender: AnyObject?) -> AnyObject? {
if ((action == Selector("paste:") || (action == Selector("cut:"))) && self.readonly) {
return nil
}
return super.targetForAction(action, withSender: sender)
}
}
Ответ 4
Пользователи раскадровки могут захотеть взглянуть на это решение, если вы в порядке с подклассами.
Я не думаю, что есть простой способ добиться этого с помощью расширений или протоколов.
Swift 3.1
import UIKit
@IBDesignable
class CustomTextField: UITextField {
@IBInspectable var isPasteEnabled: Bool = true
@IBInspectable var isSelectEnabled: Bool = true
@IBInspectable var isSelectAllEnabled: Bool = true
@IBInspectable var isCopyEnabled: Bool = true
@IBInspectable var isCutEnabled: Bool = true
@IBInspectable var isDeleteEnabled: Bool = true
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
switch action {
case #selector(UIResponderStandardEditActions.paste(_:)) where !isPasteEnabled,
#selector(UIResponderStandardEditActions.select(_:)) where !isSelectEnabled,
#selector(UIResponderStandardEditActions.selectAll(_:)) where !isSelectAllEnabled,
#selector(UIResponderStandardEditActions.copy(_:)) where !isCopyEnabled,
#selector(UIResponderStandardEditActions.cut(_:)) where !isCutEnabled,
#selector(UIResponderStandardEditActions.delete(_:)) where !isDeleteEnabled:
return false
default:
//return true : this is not correct
return super.canPerformAction(action, withSender: sender)
}
}
}
Gist link
Ответ 5
Внедрите этот метод в ViewController.m. Этот метод поможет вам отключить параметры в UITextField
.
Включает в себя вставку, выбор, выборВсе и копирование на соответствующем UITextField
.
Этот метод очень полезен в случае UITextField
, если вы хотите принять это для пароля или DateOfBirth
или того, что вы хотите.
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if ((_TextField1 isFirstResponder] || [_TextFied2 isFirstResponder]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
}
return [super canPerformAction:action withSender:sender];
}
Ответ 6
В iOS 9 мы можем скрыть панель копирования с клавиатуры
-(void) customMethod{
yourTextField.inputAssistantItem.leadingBarButtonGroups = @[];
yourTextField.inputAssistantItem.trailingBarButtonGroups = @[];
}
Ответ 7
Небольшое обновление этого ответа для iOS 10 и более ранних версий (Swift 3):
open override func target(forAction action: Selector, withSender sender: Any?) -> Any? {
guard isReadonly else {
return super.target(forAction: action, withSender: sender)
}
if #available(iOS 10, *) {
if action == #selector(UIResponderStandardEditActions.paste(_:)) {
return nil
}
} else {
if action == #selector(paste(_:)) {
return nil
}
}
return super.target(forAction: action, withSender: sender)
}
Ответ 8
ПРИМЕЧАНИЕ. В Swift, если вы хотите, чтобы ваше текстовое поле отключило все UIResponderStandardEditActions
(вырезать, скопировать, вставить, посмотреть, поделиться, выбрать), используйте это UITextFieldDelegate
.
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
textField.isUserInteractionEnabled = false
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
textField.isUserInteractionEnabled = true
}
Ответ 9
Если для вас отключен выбор текста, попробуйте это.
class NoMoreSelectionTextField: UITextField {
override func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}
override var selectedTextRange: UITextRange? {
get { return nil }
set { return }
}
}
Ответ 10
Попробуйте это в вашем viewController
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
return [super canPerformAction:action withSender:sender];
}
Ответ 11
Решение Swift 5:
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(UIResponderStandardEditActions.copy(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) {
return false
}
return true
}
Ответ 12
вы можете увеличить текстовое представление или текстовое поле в swift, например:
extension UITextView {
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
Ответ 13
Переопределение targetForAction: withSender лучше всего ИМХО:
- (id)targetForAction:(SEL)action withSender:(id)sender
{
if (action == @selector(paste:)) {
return nil;
}
return [super targetForAction:action withSender:sender];
}
Ответ 14
версия Swift 3.0
class NoMenuTextField: UITextField {
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
if (action == #selector(NSObject.paste(_:))) {
return false
}
return super.canPerformAction(action, withSender: sender)
}
}
Ответ 15
использовать для iOS 7 или более поздней версии
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
}];
return [super canPerformAction:action withSender:sender];
}
Ответ 16
Просто установите userInteractionEnabled = NO;