iPhone / iPad: Как сделать UITextField доступным только для чтения (но не отключенным)?

#ios #objective-c #xamarin.ios

#iOS #objective-c #xamarin.ios

Вопрос:

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

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

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

РЕДАКТИРОВАТЬ: это для моего проекта MonoTouch. У меня очень ограниченные знания Objective-c.

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

1. Очень просто присвоить общее значение тега всем ‘не редактируемым’ текстовым полям и проверить его в методе ‘textFieldDidBeginEditing’ и соответствующим образом вернуть BOOL

Ответ №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 из этого метода, чтобы разрешить продолжение редактирования.

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

UITextField Документация также полезна для чтения.


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

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

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

1. Большое вам спасибо за ваш быстрый ответ. Извините, я забыл упомянуть в своем вопросе, что я работаю в проекте MonoTouch. Исходя из моих ограниченных знаний object-c, я не понимаю, что вы пытаетесь здесь сделать. На самом деле, я ищу простое решение (например, установку свойства), если это вообще возможно. Если для его работы требуется так много кода, я, вероятно, попытаюсь найти другое решение.

2. Дюжина или около того строк кода — это слишком много для вас? И, кстати, вы устанавливаете свойство, свойство делегата. И этот делегат решает, сможете ли вы отредактировать поле.

3. @miliu, без обид, но это правильный ответ. Почему бы не потратить время на его реализацию и, возможно, изучить некоторые objective-c при этом?

4. Единственным свойством, связанным с запретом ввода в текстовое поле, было бы установить enabled для свойства NO значение, но, как вы сказали, это «отключит» все текстовое поле вместе, предотвращая запуск событий. Но, если вы реализуете textFieldShouldBeginEditing: метод, он автоматически вызывается всякий раз, когда кто-то касается поля ввода, и все, что вы возвращаете из этого метода, определяет, можно ли вводить текст в поле или нет. Заканчивается пространство для комментариев… смотрите мой следующий комментарий…

5.У меня нет никакого опыта работы с MonoTouch, но ознакомьтесь с этими руководствами: icodeblog.com/2008/07/30/…jomnius .blogspot.com/2010/07/…roseindia.net/tutorial/iphone/examples/…iphonesdkdev.blogspot.com/2009/01 /…

Ответ №2:

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

В monotouch:

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

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

1. Это полезно при замене представления ввода (клавиатуры) пользовательским представлением (например, средством выбора даты).

Ответ №3:

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

Ответ №4:

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

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

Ответ №5:

Objective C:

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

  return NO;
}
 

Swift :

 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

  return false
}
 

Ответ №6:

Я лично использую BorderStyle = .none userInteractionEnabled = false, чтобы он выглядел как обычная метка.