UISearchBar выделить весь текст

Есть ли способ выделить весь текст в UISearchBar? Я попытался [searchBar selectALL:], но он выбрасывает сигнал (нераспознанный селектор).

Я хочу разрешить пользователю изменять предыдущий текст поиска. В какой-то момент, когда пользователь только начинает набирать новый запрос, старый должен быть отклонен. Стандартный способ, как этого добиться - выделить весь текст в тот момент, когда текст начинает редактироваться.

6 ответов

Решение

Вот еще одно предложение: когда кто-то активирует панель поиска, возможны два намерения: ввести новый текст или добавить к существующему. Я думаю, что вы должны предоставить своему пользователю выбор.

Если он хочет добавить текст, он, естественно, снова нажимает в конце существующего текста.

Если он хочет начать все сначала, он может нажать кнопку очистки, которая автоматически появляется, когда панель поиска становится активной.

Это может быть выполнено с использованием стандартной семантики UIResponder. Не нужно копаться в иерархии частного просмотра UISearchBar.

[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil]

Вы можете позвонить это из любого места, и selectAll: Селектор запустит цепочку респондента, чтобы увидеть, отвечают ли какие-либо объекты на него Предполагая, что ваша строка поиска в настоящее время является первым респондентом (если пользователь вводит ее), она ответит, и в результате будет выбран весь текст. Если нет, вы можете сделать это первым ответчиком, позвонив becomeFirstResponder на панели поиска.

[_mySearchBar becomeFirstResponder]
[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil]

В моем случае отправка selectAll(_:) не работал сразу после звонка becomeFirstResponder,

Я работал над этим, ожидая один runloop:

Свифт 2:

dispatch_async(dispatch_get_main_queue()) {
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil)
}

Свифт 3:

DispatchQueue.main.async(execute: {
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil)
})

Если вы хотите, чтобы функция "заменить тип" предоставляла вам выделение текста в UITextField (то есть дополнительное нажатие на крестик недопустимо), вы можете пролистать подпредставления UISearchBar, чтобы найти UITextField (или UISearchBarTextField) и выбрать его текст:

// need to select the searchBar text ... 
UITextField * searchText = nil;
for (UIView *subview in searchBar.subviews) 
{
    // we can't check if it is a UITextField because it is a UISearchBarTextField.
    // Instead we check if the view conforms to UITextInput protocol. This finds
    // the view we are after.
    if ([subview conformsToProtocol:@protocol(UITextInput)]) 
    {
        searchText = (UITextField*)subview;
        break;
    }
}

if (searchText != nil)
    [searchText selectAll:self];

Swift 4

Если вы хотите выделить весь текст, когда searchBar стать первым респондентом.

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    DispatchQueue.main.async {
        UIApplication.shared.sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, for: nil)
    }
    return true
}

Я не думаю, что есть способ выделить весь текст. Может быть, когда есть акцент на UISearchBar Вы можете очистить строку поиска следующим образом - searchBar.text = @""

т.е. чистый текст в строке поиска... Надеюсь, это поможет каким-то образом...

Вы можете сделать это, сохранив BOOL указывает на то, что редактирование текстового поля панели поиска только началось. Затем вы можете поймать первое нажатие клавиши в методах делегата searchBar.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
   firstEdit = YES;
}

- (BOOL)searchBar:(UISearchBar *)searchBar 
       shouldChangeTextInRange:(NSRange)range 
       replacementText:(NSString *)text {

   if (firstEdit) {
      searchBar.text = text;
      firstEdit = NO;
   }
   return YES;
}
Другие вопросы по тегам