#iphone #objective-c #ipad #uinavigationcontroller
#iPhone #objective-c #iPad #uinavigationcontroller
Вопрос:
У меня есть приложение UINavigationController с корневым контроллером представления, и каждый раз, когда я помещаю контроллер представления в стек. Допустим, стек представляет собой A B C D, где A здесь является контроллером корневого представления. Проблема в том, что когда я нахожусь на контроллере просмотра D и выполняю popToRootViewController, он возвращается к A, но на нем есть кнопка возврата. Когда я нажимаю «Назад», задняя часть просто скользит и исчезает, почему это происходит?
РЕДАКТИРОВАТЬ: на самом деле я подклассирую свой UINavigationController, чтобы я мог установить свой RootViewController следующим образом:
#import "CustomNavigationController.h"
@implementation CustomNavigationController
@synthesize fakeRootViewController;
//override to remove fake root controller
-(NSArray *)viewControllers {
NSArray *viewControllers = [super viewControllers];
if (viewControllers != nil amp;amp; viewControllers.count > 0) {
NSMutableArray *array = [NSMutableArray arrayWithArray:viewControllers];
[array removeObjectAtIndex:0];
return array; }
return viewControllers; }
//override so it pops to the perceived root
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
//we use index 0 because we overrided “viewControllers”
((UIViewController *)[self.viewControllers objectAtIndex:0]).navigationItem.hidesBackButton = YES;
return [self popToViewController:[self.viewControllers objectAtIndex:0] animated:animated]; }
//this is the new method that lets you set the perceived root, the previous one will be popped (released)
-(void)setRootViewController:(UIViewController *)rootViewController {
rootViewController.navigationItem.hidesBackButton = YES;
[self popToViewController:fakeRootViewController animated:NO];
[self pushViewController:rootViewController animated:NO]; }
- (void)dealloc {
self.fakeRootViewController = nil;
[super dealloc]; }
-(id)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if(self){
UIViewController *fakeController = [[[UIViewController alloc] init] autorelease];
self.fakeRootViewController = fakeController;
NSMutableArray *array = [NSMutableArray arrayWithArray:[super viewControllers]];
[array insertObject:fakeController atIndex:0];
self.viewControllers = array;
}
return self; }
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use. }
#pragma mark - View lifecycle
/* // Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView { }
*/
/* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad]; }
*/
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil; }
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait); }
@end
ДОПОЛНИТЕЛЬНЫЕ ОБНОВЛЕНИЯ:
Итак, после того, как я установил свой RootViewController, а затем нажал ViewController, а затем попытался вызвать popToRootViewController из этого представления, все работало нормально. Однако, если я нажму другой ViewController после второго, а затем вызову popToRootViewController, теперь я вижу эту странную кнопку возврата в корне.
Комментарии:
1. Возможно ли, что вы нажимаете A на стек (снова), прежде чем нажимать другие представления в стеке?
2. Если вы попытаетесь подключиться к root, избавиться от дополнительной кнопки «Назад», вернуться в стек и снова подключиться к root, кнопка «Назад» все еще там? Если это не так, это будет означать, что вы помещаете A в стек при инициализации.
3. В качестве проверки работоспособности вы можете перечислить свойство UINavigationController ViewControllers и проверить, какие контроллеры были добавлены в стек. Это решило бы вопрос о том, был ли дополнительный экземпляр A помещен в стек. Указывает ли заголовок кнопки возврата на то, какой это контроллер?
4. извините.. Я пропустил очень важную часть этого, я фактически подклассировал свой собственный UINavigationController, чтобы я мог установить корневой контроллер представления, как указано выше..
Ответ №1:
Я тоже сталкиваюсь с той же проблемой. Итак, в вашем корневом контроллере назначьте leftBarButtonItem равным нулю.
self.navigationItem.leftBarButtonItem = nil;
Если ваш корневой контроллер повторно используется в программе. Затем вам нужно проверить ->
BOOL needBackBarButton = (1 < [self.navigationController.viewControllers count]) ? YES : NO ;
if (! needBackBarButton)
{
self.navigationItem.leftBarButtonItem = nil;
}
Для других контроллеров
if (needBackBarButton)
{
// Create custom navigationItem here.
}
else
{
self.navigationItem.leftBarButtonItem = nil;
}
Комментарии:
1. но тогда как мне сделать кнопку возврата для тех, которые мне нужны?
2. Вам не нужно думать о других контроллерах. Вы просто добавляете self.navigationItem.leftBarButtonItem = nil; это в методе viewDidLoad вашего корневого Viewcontroller viewDidLoad. Я надеюсь, что это должно решить вашу проблему.
3. У меня это было, и это ничего не изменило