#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, как показано на рисунке ниже:
У меня есть это в git для легкого доступа здесь. Пожалуйста, дайте мне знать, если это полезно для вас!
Тони
Комментарии:
1. На самом деле, это именно то, для чего
canPerformAction:withSender:
предназначено. Вы не должны внедрятьtargetForAction:withSender:
.2. По какой причине вам не следует использовать targetForAction:withSender:? @quellish
3. Документация UIResponder.
canPerformAction:withSender:
позволяет настраивать команды меню. Именно так приложение узнает, должны ли команды меню редактирования быть доступны в данном контексте.targetForAction:withSender:
это то, что связывает команду с целью — ПОСЛЕcanPerformAction:withSender:
вызывается для проверки того, что команда должна быть доступна. Вы хотите сделать команды меню недоступными —canPerformAction:withSender:
это правильный способ сделать это.
Ответ №2:
Если UITextView создается как объект на раскадровке, решение еще проще. В инспекторе атрибутов для объекта UITextView в разделе Поведение снимите флажок Редактируемый и снимите флажок выбираемый. В разделе «Просмотр прокрутки» вы можете включить прокрутку, если хотите, чтобы пользователь мог прокручивать текст.