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;
}