UISearchBar выделить весь текст - PullRequest
6 голосов
/ 08 декабря 2011

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

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

Ответы [ 7 ]

10 голосов
/ 05 марта 2015

Это может быть выполнено с использованием стандартной семантики 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]
4 голосов
/ 19 января 2012

Если вы хотите, чтобы функция «заменить тип» предоставляла вам выделение текста в 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];
3 голосов
/ 20 ноября 2016

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

Я обошел ее, подождав один цикл выполнения:

Swift 2:

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

Swift 3:

DispatchQueue.main.async(execute: {
    UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil)
})
2 голосов
/ 08 декабря 2011

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

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

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

0 голосов
/ 07 июля 2019

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
}
0 голосов
/ 08 декабря 2011

Вы можете сделать это, сохранив 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;
}
0 голосов
/ 08 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...