Какое событие вызывается, когда мы нажимаем UISearchBar

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

что лучше всего подходит для этого.

Как один из способов, когда мы нажимаем UISearchbar "searchBarTextDidBeginEditing" , запускаем его, но с моим сценарием, когда я нажимаю контроллер просмотра в "searchBarTextDidBeginEditing" и возвращаюсь обратно, поискBarTextDidBeginEditing снова вызывает вызов, так что кажется, что это не идеальное место для нажатия на контроллер просмотра.

Это maincontroller

// Search bar
  iSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 40)];
  iSearchBar.delegate = self;
  iSearchBar.showsCancelButton = NO;
  iSearchBar.autocorrectionType = UITextAutocorrectionTypeNo;
  iSearchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
  [self addSubview:iSearchBar];

когда я нажимаю UISearchBar, он вызывает

   - (void)searchBarTextDidBeginEditing:(UISearchBar*)searchBar
   {
   [self ShowMySearch];
   }

В ShowMySearch я нажимаю какой-то другой контроллер, который позволяет сканировать searchcontroller и когда pop this searchcontroller и вернуться к maincontroller   "searchBarTextDidBeginEditing" снова вызовет вызов, а searchcontroller снова нажат и вызывает проблему. это поведение наблюдается только на 3.1.1

Спасибо,

Сагар

Ответ 1

Я думаю, что вызов [self ShowMySearch] в "searchBarTextDidBeginEditing" немного задерживается. Я полагаю, что "searchBarTextDidBeginEditing" вызывается при ответе на панель поиска, которая становится первым ответчиком. Так как это первый ответчик, когда контроллер поиска нажат, он, вероятно, снова станет первым ответчиком, когда ваш контроллер поиска выскочит... таким образом снова вызвав "searchBarTextDidBeginEditing" .

Чтобы добиться этого, я бы использовал:

  • (BOOL) searchBarShouldBeginEditing: (UISearchBar *) searchBar

Этот метод вызывается после прослушивания строки поиска, но до того, как он станет первым ответчиком. И если вы вернете НЕТ, он никогда не станет первым ответчиком:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar*)searchBar {
    [self ShowMySearch];
    return NO;
}

Сообщите мне, если это сработает!

Ответ 2

Для Свифта 5.

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
        handleShowSearchVC()
        return false
    }

    @objc func handleShowSearchVC() {
        let modalUserSearchController = UserSearchController(collectionViewLayout: UICollectionViewFlowLayout())
        modalUserSearchController.modalPresentationStyle = .overCurrentContext

        //Mini app panel.
        //vc.view.frame = CGRectMake(0, vc.view.frame.size.height - 120, vc.view.frame.size.width, 120)

        //Present #1
        // present(modalUserSearchController, animated: true, completion: nil)

        //Presentation #2
        navigationController?.pushViewController(modalUserSearchController, animated: true)
    }