Подтвердить что ты не робот

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, которое я пропустил в документации? Если да, то что должно быть альтернативой?

Если нет, допустил ли я ошибку в своем коде?

4b9b3361

Ответ 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.