2012-05-13 5 views
4

Я хочу, чтобы вернуться к предыдущему контроллеру представления, когда я нажимаю на кнопку отмены моего контроллера поиска дисплея я использовал код:Как реализовать правильную uinavigationbar назад функциональные кнопки

[self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:0] animated:YES]; 

, но это дает мне следующее сообщение об ошибке:

* Нагрузочного приложение из-за неперехваченное исключение «NSInternalInconsistencyException», причина: «поиск в содержимом навигационного контроллера не должен меняться между -SETACTIVE: ДА и -SETACTIVE: NO»

ответ

4

[self.navigationController popViewControllerAnimated: ДА];

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

+0

Это самый простой способ сделать это при условии, вы просто хотите вернуть один VC в стек nav. –

+0

это дает мне ту же ошибку? –

+1

Трудно сказать, из-за того, что вы описали, почему возникает ошибка. я думаю, вы делаете что-то на панели навигации, которая вызывает эту ошибку. Из документации UINavigationBar относительно свойства делегата: «Если панель навигации была создана контроллером навигации и управляется этим объектом, вы не должны изменять значение этого свойства. Контроллеры навигации действуют как делегат для любых навигационных баров, которые они создают «. - –

0

Вам не нужно popToViewController, если все, что вам нужно сделать, это вернуться к предыдущему виду, просто добавить кнопку назад на navigationcontroller и вы можете нажать ее, чтобы вернуться: -

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
     style:UIBarButtonItemStylePlain target:nil action:nil]; 
self.navigationItem.backBarButtonItem = backButton; 
[backButton release]; 

или, если вы действительно хотите, чтобы совать использование просмотра этого: -

UINavigationController *navController = self.navigationController;  

    [UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration: 0.7]; 
    [UIView setAnimationTransition:<#UIViewAnimationTransitionCurlDown#> forView:navController.view cache:NO]; 

    [navController popViewControllerAnimated:NO]; 

    [UIView commitAnimations]; 
+0

я использовал второй код, потому что я хочу, чтобы вернуться к предыдущему виду, но это дает мне ту же ошибку –

0

Объект с индексом 0 является корневой контроллер представления. так что это первый объект в стеке. но вы можете только поместить последний объект. Вместо того чтобы использовать

[self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:0] animated:YES]; 

использование

[self.navigationController popToViewController: [self.navigationController.viewControllers lastObject] animated:YES]; 

или

[self.navigationController popToViewControllerAnimated:YES]; 
2

Моя проблема была контроллер searchdisplay не может SetActive по uinavigator так я решить мою проблему, добавьте следующий код:

[self.searchDisplayController SetActive: NO];

[self.navigationController popViewControllerAnimated: YES];

Ошибка:

* Отказ Утверждение в - [UISearchDisplayController SetActive: анимированные:], /SourceCache/UIKit_Sim/UIKit-1914.84/UISearchDisplayController.m:617 2012-05-13 19:07: 44,696 MyApp [3648: 11903] * Нагрузочный приложение из-за неперехваченного исключением «NSInternalInconsistencyException», причина: «поиск в содержимом навигационный контроллер не должен меняться между -SETACTIVE: ДА и -SETACTIVE: нЕТ»

+0

Спасибо, что опубликовали это, и он исправил мою проблему. –

2

у меня была такая же проблема, и нашел решение.

Трюк не должен давать searchDisplayController для того, чтобы позвонить в -setActive:animated:, но не в -viewWillDisappear. Таким образом, вы должны сделать свой контроллер просмотра делегатом searchBar (чтобы отловить кнопку «Отменить») и заложить скрытую кнопку на фоне, когда searchDisplayController действительно активизировался (чтобы отловить краны на пустое пространство экрана).

В контроллере зрения реализовать эти методы:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self.searchDisplayController setActive:NO animated:animated]; 
} 

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

- (void)backgroundClicked:(id)sender 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 


- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller 
{ 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button addTarget:self action:@selector(backgroundClicked:) forControlEvents:UIControlEventTouchUpInside]; 

    CGFloat searchBarHeight = controller.searchBar.frame.size.height; 
    button.frame = CGRectOffset(self.view.bounds, 0.f, searchBarHeight) ; 
    [self.view addSubview:button]; 
}