Кнопка отмены UISearchBar - PullRequest
       3

Кнопка отмены UISearchBar

10 голосов
/ 16 декабря 2011

Использование UISearchBar с showCancelButton = YES на iOS 5. Хотелось бы, чтобы кнопка отмены оставалась включенной, когда клавиатура опускается.Использование следующего кода, по-видимому, не работает:

    for (id subView in self.searchControl.subviews)
    {
        if ([subView isKindOfClass:[UIButton class]])
        {
            UIButton *cancelButton = (UIButton *)subView;
            [cancelButton setEnabled:YES];
            break;
        }         
    }

Подвид фактически является кнопкой UINavigationButton, которая, по-видимому, не разделена на подклассы UIButton.Что мне здесь не хватает ???????Также не могу найти никакой информации о классе UINavigationButton в документации Apple.

Ответы [ 6 ]

21 голосов
/ 20 марта 2014

Установите свой делегат на панели поиска и затем поставьте этот код.

- (void) searchBarSearchButtonClicked:(UISearchBar*) theSearchBar
  {
     [theSearchBar resignFirstResponder];
     [theSearchBar setShowsCancelButton:NO animated:YES];
  }
 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
  {
     [searchBar setShowsCancelButton:YES animated:YES];
  }
  - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
  {
     [searchBar resignFirstResponder];
     [searchBar setShowsCancelButton:NO animated:YES];
  }

Swift 3.0

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
     searchBar.resignFirstResponder()
     searchBar.setShowsCancelButton(false, animated: true)
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
     searchBar.setShowsCancelButton(true, animated: true)
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
     searchBar.resignFirstResponder()
     searchBar.setShowsCancelButton(false, animated: true)
}
2 голосов
/ 18 октября 2012

Просто чтобы улучшить то, что Курт Шпиндлер сказал на своем посту.Хотя это не может быть лучше, но это более сдержанно.Я использую диспетчеризацию, чтобы сделать то же самое.

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
    for (UIView *subview in searchBar.subviews)
    {
        if ([subview isKindOfClass:[UIButton class]])
        {
            int64_t delayInSeconds = .001;
            dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
            dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
                UIButton * cancelButton = (UIButton *)subview;
                [cancelButton setEnabled:YES];
            });
            break;
        }
    }
}

Это должно работать для всех, кому нужна помощь, оставьте отмену включенной.Убедитесь, что вы скрыли его позже, нажав «Отмена» или «Поиск».

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
    [searchBar resignFirstResponder];
    [searchBar setShowsCancelButton:NO animated:YES];
}
1 голос
/ 05 февраля 2019

Swift 4:

if let btnCancel = searchBar.value(forKey: "cancelButton") as? UIButton {
    btnCancel.isEnabled = true
}
1 голос
/ 09 февраля 2017

Я знаю, что это старый, но я смог решить его, и я не смог найти что-то еще на SO, которое решило бы это для меня, поэтому вот что сработало (в Swift 3):

Включитькнопка отмены, когда клавиатура прячется.Добавьте это к viewDidLoad ():

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(notification:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil)

в методе клавиатурных уведомлений (уведомлений :), реагируйте на уведомления клавиатурыDidHide:

func keyboardNotification(notification: NSNotification) {
    if notification.name == Notification.Name.UIKeyboardDidHide {
        self.enableSearchCancelButton()
    }
}

Кнопка enableSearchCancelButton берется из ответов других пользователей здесь .

func enableSearchCancelButton() {
    //enable the cancel button
    for view1 in searchBar.subviews {
        for view2 in view1.subviews {
            if let button = view2 as? UIButton {
                button.isEnabled = true
                button.isUserInteractionEnabled = true
            }
        }
    }
}

Наконец, не забудьте удалить контроллер представления в качестве наблюдателя:

deinit {
    NotificationCenter.default.removeObserver(self)
}
1 голос
/ 08 января 2013

Я поместил пользовательскую кнопку отмены над кнопкой отмены панели поиска.

1 голос
/ 29 декабря 2011

Мне пришлось решить ту же проблему в моем приложении.Попробуйте выполнить приведенный выше код после небольшой задержки, например,

[self performSelector:@selector(delayedEnable:) withObject:cancelButton afterDelay:0.001];

- (void)delayedEnable:(UIButton*)button {
    button.enabled = YES;
}

Это ужасно, но это то, что мне нужно, чтобы работать.В качестве альтернативы, если вы на самом деле используете UISearchDisplayController для отображения результатов, он также должен исправить поведение кнопки отмены для вас (я думаю - я углубился в эту проблему меньше).

...