Как предотвратить ввод текста в UITextView? - PullRequest
0 голосов
/ 12 октября 2009

У меня есть запись в текстовом поле, к которой я хотел бы заблокировать доступ во время фоновой операции. Я попытался использовать свойство editable, которое успешно блокирует доступ во время фоновой операции, но в тот момент, когда я установил editable в YES, появляется клавиатура, и текстовое поле становится первым респондентом. Отмена клавиатуры сразу после изменения редактируемого ничего не делает:

// Broken code
textView.editable = YES;
[textView resignFirstResponder];

Я думал о добавлении прозрачного UIView, который просто блокирует доступ к UITextView после закрытия клавиатуры, но это кажется излишним. Есть ли правильный способ справиться с этим?

Просто чтобы людям не приходилось читать дальше, чем выбранный ответ: оказывается, что это «известная проблема» в SDK, и ее можно найти в примечаниях к выпуску. Использование userInteractionEnabled выполняет ту же функцию, если вы сами уберете клавиатуру.

Ответы [ 6 ]

6 голосов
/ 12 октября 2009

Попробуйте textView.userInteractionEnabled = NO;

1 голос
/ 12 октября 2009

Поместите UIView перед UITextView с темным (или белым) фоновым цветом и установите альфа-канал низким (например, 5%) размером, чтобы полностью покрыть текстовое представление. По умолчанию это скрытый.

Если вы хотите отключить ввод текста, отправьте ему resignFirstResponder, а затем отобразите скрытый слой сверху. Он перехватывает пользовательский ввод (и игнорирует его). Альфа-цвет сделает его тусклым. После завершения фоновой операции просто установите вид обложки на скрытый, и все готово. Если вы хотите, чтобы получить фантазию, вы можете сделать UIView альфа-анимации затухания.

0 голосов
/ 12 октября 2009

Используйте UITextViewDelegate . Вам нужно поменять объект делегата в зависимости от текущего состояния.

Если в заблокированном состоянии, вы будете использовать делегата, где textViewShouldBeginEditing возвращает NO.

, другой делегат textViewShouldBeginEditing вернет YES.

0 голосов
/ 12 октября 2009

Подкласс UITextView и реализовать один метод:

- (BOOL) canBecomeFirstResponder { return NO; }
0 голосов
/ 12 октября 2009

Слава богу, кто-то придумал лучший ответ. Я изначально построил его с помощью следующего блокировщика, но userInteractionEnabled BOOL намного проще.

Оказывается, проблема в известной проблеме с UITextView. Мой обходной путь:

#import <UIKit/UIKit.h>

/**
 God damn SDK bug means that you can't use editable to enable/disable a 
 UITextView (It brings up the keyboard when re-enabling)
 */
@interface StupidF_ingTextViewBlocker : UIView {
}
@end


@implementation StupidF_ingTextViewBlocker

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // Initialization code
        self.backgroundColor = [UIColor clearColor];
        self.opaque = NO;
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}

@end

Затем вместо кода, который я поместил выше (вместо использования редактируемого). Чтобы отключить (при условии, что у меня есть iVar, называемый блокировщиком):

// Put this in a lazy loading property or in loadView
blocker = [[StupidF_ingTextViewBlocker alloc] initWithFrame:writeView.frame];

// The blocker code  ~= textView.editable = NO
[self.view addSubview:blocker];

// Removing the blocker ~= textView.editable = YES
[blocker removeFromSuperView];
0 голосов
/ 12 октября 2009

Я не уверен в «правильном пути», но я, вероятно, выбрал бы решение с прозрачным представлением ... Я согласен, что это кажется излишним, но простое решение часто является хорошим ответом.

Поскольку представление фокусируется на изменении свойств editable, это будет проще.

другое решение, о котором я могу подумать, - это получить пользовательское UITextView и перекодировать редактируемое свойство (или создать новый метод), которое может выполнить то, что вы пытаетесь сделать. Это хорошее объектно-ориентированное решение, но оно может оказаться громоздким.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...