2015-04-30 2 views
13

Я добавил UISearchController в свое приложение и установил его в SearchBar на моего navigationItem.UISearchController searchBar показываетCancelButton не соблюдается

Это работает, но я вижу кнопку отмены, несмотря на то, что установил showsCancelButton в false.

searchController = UISearchController(searchResultsController: searchResultsController) 
    searchController.searchResultsUpdater = searchResultsUpdater 


    // Configure the searchBar 
    searchController.searchBar.placeholder = "Find Friends..." 
    searchController.searchBar.sizeToFit() 
    searchController.searchBar.showsCancelButton = false 

    self.definesPresentationContext = true 

    navigationItem.titleView = searchController.searchBar 

enter image description here

+0

Можете ли вы разместить больше своего кода. –

+0

Какой-нибудь предмет в частности? –

ответ

7

Это, кажется, ошибка в IOS. Такое же поведение я описал можно увидеть в примере проекта, поставляемого компании Apple

https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html

документации говорится, что по умолчанию это NO, но это, кажется, не так. Установка showsCancelButton на NO, похоже, не имеет эффекта.

Я подал радар для этого и жду, чтобы услышать.

+0

ли яблоко вернуться к вам по этой проблеме? Я все еще вижу это на 8.4. – vinnybad

+1

@vinnybad К сожалению, я до сих пор не получил ответа. Я обязательно обновлю это, если я когда-нибудь это сделаю. –

0

Я хотел бы также добавить

searchController.hidesNavigationBarDuringPresentation = false 
searchController.delegate = self 
searchController.searchBar.delegate = self 

Смотрите, если назначение этих делегатов поможет.

+0

Добавлено, но безрезультатно –

+0

Просто добавьте, что «hidesNavigationBarDuringPresentation» предотвращает рост строки поиска при фокусировке –

-1
+0

Пробовал, но кнопка отмены все еще показывает –

+0

Когда вы это назовете? –

+0

В 'viewDidLoad'. Странно, потому что по умолчанию для showCancelButton предполагается «ложь», поэтому не имеет значения –

-1

Я стараюсь помочь вам, но я не уверен, что я нахожу настоящую проблему.

По Apple Documentation:

showsCancelButton 

Логическое свойство, указывающее, является ли кнопка отмены отображается

Но скрыть кнопку отмены, может быть, вы должны использовать:

setShowsCancelButton(_:animated:) 

enter image description here

Надеюсь, это может быть полезно.

+0

В файле заголовка для UISearchBar указано, что значение по умолчанию для 'showCancelButton' неверно, поэтому, вероятно, мне не нужно ничего делать, чтобы скрыть его. –

+0

mmm просто для любопытства вы пытались использовать 'searchController.searchBar.showsCancelButton = false' в некоторых методах делегата, таких как searchBarTextDidBeginEditing? в этом случае он работает? –

+0

Все еще не работает. –

5

Я согласен, это похоже на ошибку. Проблема в том, что searchController сохраняет сброс свойства showsCancelButton поиска. Я нашел решение, которое включает в себя:

  1. подклассов UISearchBar игнорировать setShowsCancelButton.
  2. , чтобы сделать searchController использовать этот подкласс, вы должны подкласса UISearchController.
  3. И тогда вы обнаружите, что SearchBar не вызывая методы делегата поискового контроллера, так что вы должны вызвать их отдельно ...

баллонного, но это, кажется, сделать трюк.Вы можете найти полный список answer here.

0

Вы можете создать подкласс UISearchBar и переопределить метод layoutSubviews

super.layoutSubviews() 
self.showsCancelButton = false 
0

мое решение было установить атрибут каждый раз заново, когда я использовал searchcontroller соответственно его SearchBar. Я инициализировал searchcontroller лениво, не устанавливая атрибут, а затем сделал

searchController.searchBar.showsCancelButton = false 

каждый раз, прежде чем поиск начался. Вы можете сделать это в методах UISearchControllerDelegate ... т.е.

1

Я должен был исправить, поставив в небольшой хак ...

Установка альфа 0.0 на viewDidLoad, потому что он экране будет мигать.

Перед тем, как вы спросите ... willPresentSearchController не будет работать.

extension GDSearchTableViewController: UISearchControllerDelegate { 
    func didPresentSearchController(searchController: UISearchController) { 
     searchController.searchBar.setShowsCancelButton(false, animated: false) 
     searchController.searchBar.becomeFirstResponder() 
     UIView.animateWithDuration(0.1) {() -> Void in 
      self.view.alpha = 1.0 
      searchController.searchBar.alpha = 1.0 
     } 
    } 
} 
0

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

Что, наконец, работал для меня:

На создание:

searchBar.showsCancelButton = NO; 

Мы используем подкласс UISearchBar и переопределить searchBarShouldBeginEditing таким образом:

-(BOOL)searchBarShouldBeginEditing:(UISearchBar*)searchBar { 
    self.showsCancelButton = YES; 
    return YES; 
} 

Мы также переопределить resignFirstReponder (в UISearchBar подкласс):

-(BOOL)resignFirstResponder 
{ 
    self.showsCancelButton = NO; 
    return [super resignFirstResponder]; 
} 
6

Простое решение в Swift3 - нам нужно сделать CustomSearchBar без кнопки отмены и отменить соответствующее свойство в новом CustomSearchController:

class CustomSearchBar: UISearchBar { 

override func setShowsCancelButton(_ showsCancelButton: Bool, animated: Bool) { 
    super.setShowsCancelButton(false, animated: false) 
}} 


class CustomSearchController: UISearchController { 

lazy var _searchBar: CustomSearchBar = { 
    [unowned self] in 
    let customSearchBar = CustomSearchBar(frame: CGRect.zero) 
    return customSearchBar 
    }() 

override var searchBar: UISearchBar { 
    get { 
     return _searchBar 
    } 
}} 

В MyViewController я инициализировать и настроить searchController, используя этот новый пользовательский подкласс:

var mySearchController: UISearchController = ({ 
    // Display search results in a separate view controller 
    //  let storyBoard = UIStoryboard(name: "Main", bundle: Bundle.main) 
    //  let alternateController = storyBoard.instantiateViewController(withIdentifier: "aTV") as! AlternateTableViewController 
    //  let controller = UISearchController(searchResultsController: alternateController) 
    let controller = CustomSearchController(searchResultsController: nil) 
    controller.searchBar.placeholder = NSLocalizedString("Enter keyword (e.g. iceland)", comment: "") 
    controller.hidesNavigationBarDuringPresentation = false 
    controller.dimsBackgroundDuringPresentation = false 
    controller.searchBar.searchBarStyle = .minimal 
    controller.searchBar.sizeToFit() 
    return controller 
})() 
0

Это работает для меня (IOS 10):

- (void)viewWillAppear:(BOOL)animated { 
     [super viewWillAppear:animated]; 
     self.searchController.searchBar.showsCancelButton = NO; 
} 
Смежные вопросы