2013-06-13 4 views
3

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

Я попробовал немало подходов ...

-(void) searchBarCancelButtonClicked:(UISearchBar *)searchBar 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

и

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

и делегируют методы вдоль линий

[self.delegate dismissModalViewController:self] 

с

-(void) dismissModalViewController:(UIViewController*) viewToDismiss 
{ 
    [viewToDismiss dismissViewControllerAnimated:YES completion:nil]; 
} 

Я не знаю, вмешивается ли UISearchBar, но это кажется разумной гипотезой. В противном случае это общая тема, и я приношу свои извинения за задание вопроса, на который, возможно, уже был дан ответ, но я прочитал fm и googled до тех пор, пока не станет синим и не получаю никаких результатов.

+0

Что происходит, когда вы нажимаете отменить? – rocky

+0

Убедитесь, что вы установите делегат панели поиска на представленный контроллер представления. – danypata

+0

Ничего не происходит с приложением. При этом делегаты правильно настроены и все функции называются. –

ответ

4

Я испытал то же самое в UIPopoverPresentationController, в котором я использую UISearchController для фильтрации табличного представления.

проблема заключается в том, что при первом вызове функции rejectViewController он отклоняет UISearchController, но никаких эффектов на интерфейс пользователя нет, поэтому легко думать, что ничего не произошло. Это означает, что UISearchBar вмешивается, как вы упоминаете.

раствор является вызов dismissViewController дважды (я не нравится), или вызвать searchController.dismissViewController с последующим self.dismissViewController.

Swift 3 пример ...

if searchController.isActive { 
    searchController.dismiss(animated: true, completion: { 
     self.dismiss(animated: true, completion: nil) 
    }) 
} else { 
    dismiss(animated: true, completion: nil) 
} 
+1

О, боже, я не могу поверить, что это было решение ... Спасибо +1 –

+1

Отлично работает, спасибо! Мне лучше, если вы установите 'animated: false' для searchController. –

-1

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

if(self.searchController.isActive){ 
    [self.searchController dismissViewControllerAnimated:YES completion:^{ 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.35 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
      [self.navigationController dismissViewControllerAnimated:YES completion:nil]; 
     }); 
    }]; 
}else{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
}