2014-10-10 3 views
10

Я создаю приложение iOS 8 с Xcode 6.0.1 для своего iPhone 5 (на котором есть iOS 8.0.2). Я хочу сделать так, чтобы, когда пользователь нажимает на мой UITextView, весь текст выбирается, поэтому он может легко начать вводить и стирать то, что там было (но я не хочу, чтобы текст был автоматически удален, так как пользователь может захотеть сохранить его или добавить к нему). Чтобы сделать это, у меня есть следующий код:UITextView selectВсе метод не работает должным образом

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    if ([textView hasText]) { 
     NSLog(@"selectedRange before: %d", textView.selectedRange.length); 
     [textView selectAll:self]; 
     NSLog(@"selectedRange after: %d", textView.selectedRange.length); 
    } 
} 

Когда этот метод вызывается, консольный вывод, что я ожидал (т.е. длина selectedRange такой же, как количество символов в тексте textView «s) , Тем не менее, ничего не отображается, как выбрано в UITextView, и он не действует выбранным (т. Е. Всплывающее меню выбора).

Я видел несколько вопросов, подобных этому в Интернете, но ни один из предоставленных решений не работал для меня (и некоторые из них записали его как ошибку, не предоставив никакого решения). Изменение идентификатора отправителя на что-то отличное от self (например, nil) не помогло, и также не помогло позвонить [textView select:self], как предложил один человек. Я также пробовал этот код:

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    if ([textView hasText]) { 
     UITextRange *range = [textView textRangeFromPosition:textView.beginningOfDocument toPosition:textView.endOfDocument]; 
     [textView setSelectedTextRange:range]; 
    } 
} 

Но у него такая же проблема.

Любые предложения?

+0

Странное поведение. Как вы можете видеть в этом видео http://m.youtube.com/watch?v=iPXsVvva97E, он должен работать следующим образом: – TMob

+0

Точно. Я тоже видел это видео и не могу понять, что я делаю неправильно. –

+0

У меня такая же проблема, вы нашли какое-то исправление? –

ответ

3

Лучшее решение, которое я нашел для этого вопроса до сих пор создать пользовательский UITextView (т.е. создать новый класс, который расширяет UITextView), а затем реализовать selectAll метод, как это:

- (void)selectAll:(id)sender { 
    [super selectAll:sender]; 
    UITextRange *selectionRange = [self textRangeFromPosition:self.beginningOfDocument toPosition:self.endOfDocument]; 
    [self performSelector:@selector(setSelectedTextRange:) withObject:selectionRange afterDelay:0.0]; 
} 

Тогда, когда вы используете текстовое представление, задаете его тип для своего типа текстового вида (в вашем коде и в раскадровке). Теперь вы можете успешно использовать метод selectAll всякий раз, когда вам нужно. Я полагаю, что это тоже должно работать с UITextField, но я еще не пробовал.

20

Это решение работает слишком и не требует подклассов UITextView, просто поставить эту функцию делегата:

ЦЕЛЬ C -

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [textView selectAll:nil]; 
    }); 
    return YES; 
} 

СВИФТ 3 -

func textViewDidBeginEditing(_ textView: UITextView) { 
    DispatchQueue.main.async { 
     textView.selectAll(nil) 
    } 
} 
+4

Этот ответ совершенно нелепо. Это тоже 100%! –

4

@brentvatne ' решение для меня работало. Публикация синтаксиса Swift, чтобы люди могли копировать и вставлять в будущем.

func textViewShouldBeginEditing(textView: UITextView) -> Bool { 
    dispatch_async(dispatch_get_main_queue()) { 
     textView.selectAll(nil) 
    } 
    return true 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^