Как сделать UITextField доступным для выбора, но не редактируемым?

Я надеюсь, что пользователь может копировать и вставлять текст, но не редактировать его. Я использую метод делегата UITextField для реализации этого:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range       replacementString:(NSString *)string{
    return NO;
}

Таким образом, несмотря на то, что текст выбирается и не редактируется, но когда вы выделяете текст, всегда появляется клавиатура, что немного раздражает, потому что вы не можете редактировать текст. Так можно ли сделать текст доступным для выбора и не редактируемым, не показывая клавиатуру?


person chaonextdoor    schedule 19.02.2014    source источник
comment
Вы пытались сначала вызвать [textField resignFirsResponder] в своем методе delegate. Честно говоря, я понятия не имею, как он себя поведет. просто спрашиваю.   -  person Ayan Sengupta    schedule 20.02.2014
comment
Вы также можете попытаться создать подкласс UITextField - переопределить becomeFirstResponder1 method and return NO, но я думаю, что это не позволит пользователю вставлять текст.   -  person Rafał Augustyniak    schedule 20.02.2014


Ответы (5)


Что вам нужно, так это разрешить элементу управления получать все события взаимодействия с пользователем. Итак, не return NO от textFieldShouldBeginEditing. Вместо этого сделайте следующее:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    return textField != _yourReadOnlyTextField;
}

Это позволит пользователю выбрать текст, а также выбрать такие параметры, как Cut, Copy и Define из всплывающего меню.

ОБНОВЛЕНИЕ:

Кроме того, для полноты вы можете вообще запретить отображение клавиатуры в готовых текстовых полях. Итак, основываясь на принятом ответе на этот вопрос: скрыть клавиатуру uitextfield?, вы можете добавить:

- (void)viewDidLoad
{
    // Prevent keyboard from showing up when editing read-only text field
    _yourReadOnlyTextField.inputView = [[UIView alloc] initWithFrame:CGRectZero];
}
person Luis Artola    schedule 16.04.2014
comment
Очень хорошо. Именно то, что нужно, чтобы иметь возможность выделять и копировать текст, не изменяя текст. - person James; 05.01.2015
comment
Хорошее решение, но текстовый курсор все еще там. - person Toydor; 20.10.2016
comment
Мое текстовое поле было в UITableViewCell, поэтому я проверил return textfield.tag != 200 - person Yaman; 21.10.2016

Обновление для пользователей Swift:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    return textField != self.yourReadOnlyTextField;
}

и когда представление загружается

override func viewDidLoad() {
    super.viewDidLoad()
    self.selfCodeEdit.inputView = UIView.init();
}
person astromme    schedule 14.12.2016

Вы должны реализовать другой метод делегата UITextField:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return NO;
}

//ОБНОВЛЕНИЕ Кроме того, здесь есть подобные вопросы Как отключить свойство редактирования UITextField?< /а>.

person Rafał Augustyniak    schedule 19.02.2014
comment
Я попробовал это. Но текст нельзя ни выбрать, ни изменить с помощью этого метода делегата, как и UIlabel. - person chaonextdoor; 20.02.2014
comment
я хочу скопировать текст из текстового поля долгим нажатием на текстовое поле; Но также не хочу делать его редактируемым. Что я должен делать? - person msmq; 14.06.2016

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

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == firstTextField || textField == secondTextField {
        return false
    }
    return true
}
person Jack Daniel    schedule 14.12.2017

Вы можете сделать это прямо через раскадровку.
Выберите свой UITextView, а затем в инспекторе Атрибутов.
У вас есть некоторые параметры поведения:

введите здесь описание изображения

person F.Cartier    schedule 19.03.2018
comment
Вопрос касается UITextField, а не UITextView - person TheTiger; 19.03.2018