UITextView дважды нажмите, чтобы отредактировать

Итак, у меня есть UITextView, который я использую для создания подвижной редактируемой метки (мои предыдущие поиски в SO показали, что это, по-видимому, лучший вариант). Мне нужно, чтобы пользователь дважды нажимал, чтобы разрешить редактирование, и настроить его так, чтобы он стал первым респондентом. Я не могу найти способ сделать это, а все остальные мои поиски давали либо устаревшие, либо расплывчатые ответы. Ничего из того, что я пробовал, похоже, не работает. Я пробовал использовать UITextViewDelegate, чтобы он начал редактирование, а не выделял текст с помощью textViewDidChangeSelection:, но он не работает, пока вы не измените текущий выбор. Я также пробовал использовать пользовательский UITapGestureRecognizer вот так:

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[doubleTap setNumberOfTouchesRequired:1];
[newLabel addGestureRecognizer:doubleTap];

-(void)doubleTap:(UITapGestureRecognizer *)sender
{
    NSLog(@"Double tap detected");
    NSLog(@"Sender view of class %@", [[sender view] class]);
    UITextView *tappedView = (UITextView *)[sender view];
    [tappedView setEditable:YES];
    [tappedView becomeFirstResponder];
//    [tappedView setEditable:NO];
}

Жест двойного касания никогда не вызывается. Не знаю почему. Странно, но при этом тоже не выделяет текст. Вроде просто ломает жесты двойного тапа. Есть ли способ избавиться от стандартного жеста выбора двойным касанием или изменить его? Должен ли я создать подкласс UITextView и, если да, что мне изменить?


person Rob    schedule 13.07.2013    source источник


Ответы (3)


Я нашел изящное решение с меньшим количеством кода (Swift 4.2):

Создайте собственный класс UITextView и напишите в нем это

    override var canBecomeFirstResponder: Bool {
    if self.isEditable {
        return true
    } else {
        self.isEditable = true
        return false
    }

Затем в viewDidLoad () напишите следующее (или снимите флажок «Редактируемый» в разделе поведения в редакторе раскадровки)

myTextView.isEditable = false

Затем просто поместите тот же код где-нибудь, когда вы закончите редактировать текст - например. textViewDidEndEditing (_ textView: UITextView)

myTextView.isEditable = false

Когда представление загружается, textView не редактируется, и все детекторы данных работают. Затем второе нажатие позволяет редактировать его (и отключает детекторы данных).

Как только вы выходите из textView, он снова становится недоступным для редактирования, и детекторы данных работают.

И все это без распознавания жестов! :-D

person Paul Martin    schedule 26.01.2019

Создав подгруппу UITextView, я добавил этот метод в файл .m.

-(BOOL)canBecomeFirstResponder
{
    if (self.editable == YES){
        return YES;
    }
    else{
    return NO;
    }
}

В дополнение к этому я использовал

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGesture
{
    return YES;
}

Это лучший способ решить мою проблему. Я только хотел разрешить редактирование двойным нажатием. Я хотел, чтобы выделение текста, прокрутка и т. Д. Не происходило до тех пор, пока по нему не будет двойного нажатия. Чтобы закончить это, вам понадобится использовать UITextViewDelegate, чтобы повернуть textView.editable = NO

-(void)textViewDidEndEditing:(UITextView *)textView
{
    [textView setEditable:NO];
}
person Rob    schedule 14.07.2013

Вы должны установить цель распознавателя жестов как текстовое поле.

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:textField action:@selector(doubleTap:)];
person Abdullah Shafique    schedule 13.07.2013
comment
Не могли бы вы рассказать немного подробнее? Я не совсем уверен, как бы я это сделал. - person Rob; 14.07.2013
comment
ложный. это означает, что текстовое поле имеет метод, называемый doubleTap. Если вы не подклассифицируете текстовое поле, чтобы на самом деле иметь этот метод, вы столкнетесь с нераспознанной ошибкой экземпляра селектора - person kevinl; 22.11.2013