2011-02-07 3 views
2

У меня есть UITableView, что на didSelectRowAtIndexPath толкает другую UITableView, чтобы сделать поиск ...UISearchBar кнопка отмены аварии

LocationSearchViewController *locationSearchViewController = [[LocationSearchViewController alloc] initWithNibName:@"LocationSearchViewController" bundle:nil]; 
    locationSearchViewController.delegate = self;  
    UITableViewCell *cell = [myTableView cellForRowAtIndexPath:indexPath]; 
    locationSearchViewController.defaultLocation = cell.detailTextLabel.text; 

    [[self navigationController] pushViewController:locationSearchViewController animated:YES]; 
    [locationSearchViewController release]; 

Вид поиска содержит UISearchBar с его отмены включена кнопка. Если пользователь нажал кнопку отмены, приложение вылетает с помощью objc_exception_throw. Консоль отображает ...

2011-02-06 22: 05: 43,960 JetLogger [2381: 207] * отказ Assertion в - [UISearchDisplayController SetActive: анимированные:]/SourceCache/UIKit_Sim/UIKit- 1447.6.4/UISearchDisplayController.m: 589

Если, однако, пользователь вводит элемент в виде таблицы (результаты поиска) Я закрывающие вид поиска и нет никакой аварии. Я не могу понять, почему разница, как я выскакиваю вид поиска с тем же кодом ...

В LocationSearchViewController ...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([self.delegate respondsToSelector:@selector(locationSearchViewDidDismiss:withLocation:)]) { 
    [self.delegate locationSearchViewDidDismiss:self withLocation:[tableView cellForRowAtIndexPath:indexPath].textLabel.text]; 
    } 
} 
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    if ([self.delegate respondsToSelector:@selector(locationSearchViewDidDismiss:withLocation:)]) { 
    [self.delegate locationSearchViewDidDismiss:self withLocation:@"No results found"]; 
    } 
} 

В делегате ...

- (void)locationSearchViewDidDismiss:(LocationSearchViewController *)controller withLocation:(NSString*)location{ 
    if((location != @"") && (location != @"No results found")){ 
    //update the table data 
    [myTableView reloadData]; 
    } 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

Любая помощь приветствуется.

John

+0

+1 для включения регистратора сообщение. Я столкнулся с этим сегодня (в xcode 4.1), и решение Ариэля было правильным. – livingtech

ответ

0

Я просто столкнулся с этой проблемой.

Я получаю эту ошибку, когда я увольняю viewcontroller, содержащий поиск, с помощью popViewControllerAnimated. Если вы представите один и тот же элемент управления представлением в моделях и уклоняетесь от использования модальной функции увольнения, это утверждение также не срабатывает.

Чтобы устранить эту проблему, мне пришлось добавить (используя код в качестве примера)

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    [self.searchController setActive:NO animated:NO]; 
    if ([self.delegate respondsToSelector:@selector(locationSearchViewDidDismiss:withLocation:)]) { 
    [self.delegate locationSearchViewDidDismiss:self withLocation:@"No results found"]; 
    } 
} 

Таким образом, searchcontroller неактивен перед вызовом любой внутренней функции, которые он хочет. Похоже, что это ошибка с 4.2 sdk, хотя мне нужно проверить это с новым семенем 4,3 г.

Вы нашли другое решение?

я лучше не использовать, потому что некоторые исправления отклонять анимация немного некрасиво: \

+0

Извините, я только что заметил ваш вопрос. То, что я сделал, чтобы обойти это, состояло в том, чтобы не отклонить представление, когда пользователь отменил отмену. Я спрятаю панель навигации, как только загрузится окно поиска. Когда они нажимают кнопку «Отмена», я оставляю их в виде поиска и не нажимаю на панель навигации. Затем они могут либо войти в поле поиска, либо нажать кнопку «Назад» на панели навигации. Мне не нравится интерфейс, но мне пришлось двигаться дальше. Это не так уж плохо. Просто дополнительный кран для пользователя. Я согласен, что это тоже похоже на ошибку. – user278859

+0

если вы делаете то, что я сделал, то на один меньше клик для пользователя .. :) –

3

Я столкнулся с той же проблемой. XCode 4 IOS 4.3

Для меня проблема была только тогда, когда фокус находился внутри панели поиска Я нашел некоторое обходное решение, которое может помочь.

Вот код:

static BOOL _cancelBtnClicked = NO; 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    Log(@"Enter"); 
    if(searchDisplayController.active){ 
     _cancelBtnClicked = YES; 
    }else{ 
     [self back]; 
    } 
} 

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller{ 
    Log(@"Enter"); 
    if(_cancelBtnClicked){ 
     _cancelBtnClicked = NO; 
     [self back]; 
    } 
} 

-(void)back{ 
[self.navigationController popViewControllerAnimated:YES]; 
} 
6

Потому что мы поп ViewController, то Searchbar теряет фокус. Это вызывает вызов setActive, но в то время, когда это происходит, поисковая панель уже освобождена. Таким образом, мы должны активировать активность до того, как поп.Поэтому

Простым решением является:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
{ 
    [self.searchDisplayController setActive:NO animated:NO]; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

Это зафиксировало мой сбой. – Bot

0

У меня была такая же проблема.

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
{ 
    [self.searchDisplayController setActive:NO animated:NO]; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

НЕ РЕШЕТ это в моем случае. Вместо этого я назвал [self.searchDisplayController setActive: NO animated: NO] в другом месте, что вызвало его раньше.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // .... 

    [self.searchDisplayController setActive:NO animated:NO]; 
} 
3

Я думаю, что предлагаемые ответы несовершенны, поскольку они косвенно обращается к проблеме, которая является то, что searchDisplayControllerDidEndSearch: вызывается на освобождаться делегата. Вызов [self.searchDisplayController setActive:NO animated:NO] может работать в пределах searchBarCancelButtonClicked:, но он не удастся в другом месте, например, с searchBarTextDidEndEditing:.

Вместо этого просто снимите делегат непосредственно перед выскакивают контроллер: self.searchDisplayController.delegate = nil;

Это будет гарантировать, что метод делегата не будет вызываться на освобождаться инстанции.

+0

Genius. Вы здесь обязательно. – MusiGenesis

0

Swift издание

func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
    self.searchDisplayController?.active = false 
    self.dismissViewControllerAnimated(true, completion: nil) 
}