Как отключить копирование, вырезание, выделение, выделение всего в UITextView - PullRequest
102 голосов
/ 15 сентября 2009

Функции UITextView Копировать, Вырезать, Выбрать, Выбрать все отображаются по умолчанию, когда я нажимаю на экран. Но в моем проекте UITextField только для чтения. Мне не требуется эта функциональность. Подскажите пожалуйста как отключить эту функцию.

Ответы [ 28 ]

1 голос
/ 23 февраля 2018

Этот метод полностью отключит меню Select, Select All, Paste. Если вы по-прежнему получаете какое-то другое действие, просто добавьте его в условие if, как показано ниже.

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender // This is to disable select / copy / select all / paste menu
    {
        if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(select:) || action == @selector(paste:))
            return NO;
        return [super canPerformAction:action withSender:sender];
    }
1 голос
/ 06 февраля 2016

Вы можете исправить это в вашей раскадровке, сняв отметку с этого поля:

enter image description here

Или вы можете установить программно так:

textView.selectable = false
textView.editable = false
0 голосов
/ 24 сентября 2015

(SWIFT) Если вы хотите просто простое текстовое поле без опций меню или увеличительного стекла, создайте подкласс UITextField, возвращая false для gestRecognizerShouldBegin:

class TextFieldBasic: UITextField {
    override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {

        return false
    }
}

Это позволит обойти все сенсорные функции в текстовом поле, но все же позволит вам использовать всплывающую клавиатуру для добавления / удаления символов.

Если вы используете раскадровку, просто назначьте вновь созданный класс текстовому полю или если вы создаете текстовое поле программно:

var basicTextField = TextFieldBasic()
basic = basicTextField(frame: CGRectMake(10, 100, 100,35))
basic.backgroundColor = UIColor.redColor()
self.view.addSubview(basic)

basic.becomeFirstResponder()
0 голосов
/ 03 мая 2014

Вы можете просто создать категорию следующим образом:

UITextView + Selectable.h

@interface UITextView (Selectable)

@property (nonatomic, assign, getter = isTextSelectable) bool textSelectable;

@end

UITextView + Selectable.m

#import "UITextView+Selectable.h"

#import <objc/runtime.h>

#define TEXT_SELECTABLE_PROPERTY_KEY @"textSelectablePropertyKey"

@implementation UITextView (Selectable)

@dynamic textSelectable;

-(void)setTextSelectable:(bool)textSelectable {
    objc_setAssociatedObject(self, TEXT_SELECTABLE_PROPERTY_KEY, [NSNumber numberWithBool:textSelectable], OBJC_ASSOCIATION_ASSIGN);
}

-(bool)isTextSelectable {
    return [objc_getAssociatedObject(self, TEXT_SELECTABLE_PROPERTY_KEY) boolValue];
}

-(bool)canBecomeFirstResponder {
    return [self isTextSelectable];
}

@end
0 голосов
/ 05 сентября 2017

Используйте func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { retrun bool } вместо textFieldShouldBeginEditing.

class ViewController: UIViewController , UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        //Show date picker
        let datePicker = UIDatePicker()
        datePicker.datePickerMode = UIDatePickerMode.date
        textField.tag = 1
        textField.inputView = datePicker
    }

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        if textField.tag == 1 {
            textField.text = ""
            return false
        }

        return true
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if textField.tag == 1 {
            textField.text = ""
            return false
        }

        return true
    }
}

Создать новый класс с именем StopPasteAction.swift

import UIKit

class StopPasteAction: UITextField {

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

Добавьте новый класс вместе с вашим текущим TextField

enter image description here

0 голосов
/ 25 мая 2017

Swift 3

Чтобы сделать это, вам необходимо создать подкласс UITextView и поместить этот метод.

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if (action == #selector(copy(_:))) {
            return false
        }

        if (action == #selector(cut(_:))) {
            return false
        }

        if (action == #selector(paste(_:))) {
            return false
        }

        return super.canPerformAction(action, withSender: sender)
    }
0 голосов
/ 24 июня 2014

Подклассы UITextView и переопределение - (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer - это еще одна возможность отключить нежелательные действия.

Используйте класс gestureRecognizer -объекта, чтобы решить, следует ли добавить действие или нет.

0 голосов
/ 06 января 2016
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool 
{
    NSOperationQueue .mainQueue().addOperationWithBlock({ () -> Void in   

        [UIMenuController .sharedMenuController() .setMenuVisible(false, animated: true)]

    })
    return super.canPerformAction(action, withSender: sender)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...