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, той отново е настроен да не може да се редактира и детекторите на данни работят.

Всичко това без разпознаване на жестове! :-Д

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

Трябва да зададете целта на Gesture Recognizer като текстово поле.

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