IPhone/iPad: как сделать UITextField только для чтения (но не отключен)?

Я понимаю, что этот вопрос задавали раньше, но я не удовлетворен ответами, то есть отключив его. Существует принципиальное различие: отключенное представление не запускает события, но для просмотра в режиме readonly оно должно по-прежнему запускать событие подобно (например, TouchUpInside), и оно мне нужно. Единственное, чего я не хочу - это ввод с клавиатуры.

Причина в том, что у меня есть несколько полей ввода, некоторые могут использовать UITextField напрямую, другие - нет. Я хочу, чтобы они выглядели похожими. Поэтому я хотел бы использовать UITextField для отображения всех них. Некоторые из них должны быть только для чтения, поэтому я могу использовать событие touch up для альтернативного ввода.

Или может быть совершенно другой способ сделать это?

EDIT: Это для моего проекта MonoTouch. У меня очень ограниченные знания в объекте-с.

Ответы

Ответ 1

Скажем, у вас есть 2 переменных экземпляра текстового поля, связанных с текстовыми полями, созданными в построителе интерфейса. Позволяет называть их myReadOnlyTextField и myEditableTextField. Убедитесь, что вы подключили свойство delegate каждого текстового поля в построителе интерфейса к контроллеру представления ( "владелец файла" ) [1]. Теперь, в контроллере представления @implementation (.m файл), используйте метод textFieldShouldBeginEditing: и поместите в какую-то логику, чтобы определить, какое текстовое поле вы хотите разрешить редактирование и которое не разрешать редактирование; что-то вроде этого:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    BOOL editable;
    if (textField == myReadOnlyTextField) {
        editable = NO;
    } else if (textField == myEditableTextField) {
        editable = YES;
    } else {
        // editable = YES/NO/Other Logic
    }
    return editable;
}

Из UITextFieldDelegate Документация:

textFieldShouldBeginEditing:
Просит делегата начать редактирование в указанном текстовом поле.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

Параметры
textField - текстовое поле, для редактирования которого начать.

Возвращаемое значение
YES, если сеанс редактирования должен быть запущен; в противном случае NO запретить редактирование.

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

Реализация этого метода делегатом необязательна. Если это нет, редактирование продолжается, как если бы этот метод вернул ДА.

UITextField Документация также хорошо читается.


[1] Вы можете сделать это также программно. Вот пример:

- (void)viewDidLoad {
    [super viewDidLoad];
    // .....
    myReadOnlyTextField.delegate = self;
    myEditableTextField.delegate = self;
}

Ответ 2

Несмотря на то, что вам не нужна клавиатура, textField:shouldChangeCharactersInRange:replacementString: очень полезен. Это предотвращает редактирование текстового поля, но все же оставляет его доступным в отличие от textFieldShouldBeginEditing:.

В моноточе:

var txt = new UITextField();
txt.ShouldChangeCharacters += (field, range, replacementString) => false;

Ответ 3

У вас может быть два варианта: a) использовать ShouldBeginEditing с возвратом false, но вы не можете использовать PickerView в качестве InputView в текстовом поле. b) использовать символы ShouldChangeCharacters, которые предотвратят редактирование, но позволят использовать InputView с PickerView.

Ответ 4

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

myReadOnlyButton.ShouldBeginEditing = t =>
{
  //event code
  return false;
};