Как предотвратить всплывающее окно копирования / вставки / выбора в UITextView с помощью UIMenuController iOS5.1

#ios #objective-c #uitextfield #xcode5.1 #uimenucontroller

#iOS #objective-c #uitextfield #xcode5.1 #uimenucontroller

Вопрос:

Вопрос: как мне предотвратить появление всплывающего окна копирования / вставки / выбора, возникающего в UITextView (не используя UIWebView и css)?

Я не хотел идти по пути UIWebView, поскольку некоторые сообщения исчезли, потому что я уже использую UIViews с UITextFields для ввода данных. Я безуспешно пытался реализовать решения, связанные с UITextField, в моем файле реализации моего контроллера представления с помощью методов: targetForAction:withSender, setMenuVisible:animated и, наконец, canPerformAction:withSender. (Это НЕ РАБОТАЕТ — [грустное лицо])

Комментарии:

1. Это не вопрос.

2. переформатировано с моим первоначальным вопросом. Спасибо!

3. Ваш «вопрос» — это все еще скорее ответ. Если ваша цель — ответить на свой собственный «вопрос», потому что вы думаете, что это поможет другим людям, чем разделить его на реальный вопрос и опубликовать фактический ответ ниже.

4. Хорошо — я опубликовал решение моей дилеммы ниже. я надеюсь, что это понятнее и поможет некоторым людям в их приключениях на земле iOS!

Ответ №1:

Хорошо, я нашел рабочее решениеXcode 5.1) на мой вопрос, который, короче говоря, является подклассом UITextField.

Я понял, что на самом деле я не переопределял поведение по умолчанию UITextField в контроллере представления, как я хотел, и ни один из перечисленных здесь методов не переопределял поведение делегата текстового поля в файле контроллера представления. Ключевым было присвоить самому UITextField подкласс с помощью -targetForAction:withSender. (Я знаю, что некоторые из вас кричат на экран о том, насколько ОЧЕВИДНО это было!) Для меня это было не очевидно. Как и большинство проблем при первом их решении, я прошел через множество разных путей, некоторые из которых я нашел здесь, в SO. Но решение простое. Я хочу поделиться этим решением в своей области, так что, надеюсь, это может кому-то помочь.

Файл заголовка:

 //
//

#import <UIKit/UIKit.h>

@interface TPTextField : UITextField

- (id)targetForAction:(SEL)action withSender:(id)sender;
@end
  

и файл реализации (.m)

 //
//

#import "TPTextField.h"

@implementation TPTextField

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}
#pragma mark - method overrides - deny user copy/paste on UITTextFields
- (id)targetForAction:(SEL)action withSender:(id)sender
{
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    if (action == @selector(selectAll:) || action == @selector(paste:) ||action == @selector(copy:) || action == @selector(cut:)) {
        if (menuController) {
            [UIMenuController sharedMenuController].menuVisible = NO;
        }
        return nil;
    }
    return [super targetForAction:action withSender:sender];
}

@end
  

В вашей раскадровке или файле nib / xib просто подключите этот класс к вашему UITextField, как показано на рисунке ниже:

Пользовательский класс: TPTextfield

У меня есть это в git для легкого доступа здесь. Пожалуйста, дайте мне знать, если это полезно для вас!

Тони

Комментарии:

1. На самом деле, это именно то, для чего canPerformAction:withSender: предназначено. Вы не должны внедрять targetForAction:withSender: .

2. По какой причине вам не следует использовать targetForAction:withSender:? @quellish

3. Документация UIResponder. canPerformAction:withSender: позволяет настраивать команды меню. Именно так приложение узнает, должны ли команды меню редактирования быть доступны в данном контексте. targetForAction:withSender: это то, что связывает команду с целью — ПОСЛЕ canPerformAction:withSender: вызывается для проверки того, что команда должна быть доступна. Вы хотите сделать команды меню недоступными — canPerformAction:withSender: это правильный способ сделать это.

Ответ №2:

Если UITextView создается как объект на раскадровке, решение еще проще. В инспекторе атрибутов для объекта UITextView в разделе Поведение снимите флажок Редактируемый и снимите флажок выбираемый. В разделе «Просмотр прокрутки» вы можете включить прокрутку, если хотите, чтобы пользователь мог прокручивать текст.