IOS 7 не отображает кнопку отмены строки поиска на панели навигации
В приложении, которое должно работать на iOS 6 и iOS 7, кнопка отмены строки поиска, встроенная в панель навигации, больше не отображается, если приложение запущено на iOS 7. На iOS 6 он работает.
Строка поиска находится в заголовке панели навигации, и кнопка отмены должна отображаться, если панель поиска становится первым ответчиком:
iOS 7
![enter image description here]()
iOS 6
![enter image description here]()
В изолированном тестовом случае код очень прост:
@interface MyViewController : UITableViewController<UISearchBarDelegate>
@property (nonatomic) IBOutlet UISearchBar* searchBar;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.titleView = self.searchBar;
}
- (void) searchBarTextDidBeginEditing: (UISearchBar*) searchBar {
[searchBar setShowsCancelButton: YES animated: YES];
}
@end
Является ли это преднамеренным изменением в iOS 7, которое я пропустил в документации? Если да, то что должно быть альтернативой?
Если нет, допустил ли я ошибку в своем коде?
Ответы
Ответ 1
Похоже, вы все делаете правильно, но, очевидно, Apple изменила некоторые вещи в iOS 7. В соответствии с этим вопросом SO в iOS 7 кнопка отмены не отображается на UISearchBar
, встроенном в UINavigationBar
.
В соответствии с документацией разработчика свойство showsCancelButton
может иметь несколько иной эффект, чем метод setShowsCancelButton:Animated
. Попробуйте сделать это:
searchBar.showsCancelButton = YES;
[searchBar setShowsCancelButton:YES animated:YES];
Я не уверен, что это повлияет. Вы также можете попробовать разместить код в другом методе делегата:
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar; // return NO to not become first responder
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar; // called when text starts editing
Вы также можете проверить iOS 7 changelog. Похоже, Apple изменила поведение или UISearchDisplayController
/UISearchBar
при добавлении к UINavigationBar
. Взгляните на последнюю маркерную точку в разделе UIKit (хотя точно не ясно, что было изменено).
Вы также можете попробовать использовать UISerachDisplayController
. То, что может быть еще проще, - вставить UISearchBar
в заголовок UITableView
.
Ответ 2
Я решил эту проблему просто, просто добавив rightBarButtonItem:)
self.navigationItem.titleView = self.searchBar;
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil) style:UIBarButtonItemStylePlain target:self action:@selector(didClickCancelButton:)] autorelease];
Но обязательно убедитесь, что текущая версия iOS >= 7.0, иначе вы получите две кнопки отмены.
BTW Этот метод позволяет вам иметь кнопку "отменить", которая всегда включала
Ответ 3
iOS 7 отличается от iOS 6 на панели навигации, поэтому, если вы хотите отобразить панель UISearch на панели навигации, вы можете попробовать следующее:
поместите свою UISearchbar в UIView, подобную этой [self.searchView addSubview self.searchBar]
, и установите заголовок titleView в свой поиск Search, как это показано ниже: self.navagitioncontroller.navigationItem.titleView = self.searchView
Надеюсь, что это сработает для вас.
Ответ 4
Если вы используете свой UISearchBar с помощью UISearchDisplayController, вы можете просто установить кнопку отмены, чтобы показать в методе делегирования "searchDisplayControllerWillBeginSearch", например: (iOS 7)
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{
controller.searchBar.showsCancelButton = YES;
}
Ответ 5
Кажется, что между iOS6 и iOS7 происходит изменение в том, что изменения в пользовательском интерфейсе от методов xxxDidYYY
иногда не работают, и вы должны сделать это в методе xxxWillYYY
или в некотором коде, выполненном из основной цикл события (например, в блоке или после небольшой задержки).
В вашем случае попробуйте следующее:
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
searchBar.showsCancelButton = YES;
return YES;
}
Ответ 6
По-моему, это ошибка. Это мое обходное решение. Он не идеален, но работает как на iOS 6 & 7. На iOS7 текстовое поле поисковой панели скользит по кнопке отмены, пока оно исчезает, а на iOS6 расширение ширины текстового поля не анимируется.
@interface FTViewController ()
@property(nonatomic, strong) UISearchBar *searchBar;
@end
@implementation FTViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.searchBar = [[UISearchBar alloc] init];
self.searchBar.delegate = self;
if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {
// iOS 6.1 and older (only tested on 6.1)
[self.searchBar sizeToFit];
self.searchBar.backgroundImage = nil;
}
self.navigationItem.titleView = self.searchBar;
}
-(void)cancelBarButtonItemClicked:(id)sender
{
[self searchBarCancelButtonClicked:self.searchBar];
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
[self.navigationItem setRightBarButtonItem:nil animated:YES];
}
-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelBarButtonItemClicked:)];
[self.navigationItem setRightBarButtonItem:cancelBtn animated:YES];
return YES;
}
@end
Ответ 7
Есть два варианта:
- Добавьте панель поиска, например, subview в uiviewcontroller.view, и скройте панель навигации, если нужно
- Добавить кнопку отмены для uiviewcontroller.navigationItem.rightBarButtonItem
Мое предпочтение - второе, но оно выглядит более родным с первым.
Ответ 8
Это действительно ошибка, которая исправлена с 7.1.