Iphone UINavigationController和视图将消失

Iphone UINavigationController和视图将消失,iphone,objective-c,ipad,ios,Iphone,Objective C,Ipad,Ios,因此,我的应用程序中有一个UINavController,当用户按下后退按钮时,我试图执行一个方法。我到处都找遍了,只能找到一些断章取义的东西 有没有一种方法可以实现某种检查,当用户按下后退按钮关闭当前视图时,该检查会被捕获?(弹出视图的ViewWillEnglish方法由于某种原因从未被调用。我确实读过,除非你转发该调用,否则不会被调用。)这听起来正确吗,有人有什么想法或建议吗?提前感谢。当弹出或解除控制器时,将调用ViewWillEnglish&ViewDidEnglish。该函数在前视图控

因此,我的应用程序中有一个UINavController,当用户按下后退按钮时,我试图执行一个方法。我到处都找遍了,只能找到一些断章取义的东西


有没有一种方法可以实现某种检查,当用户按下后退按钮关闭当前视图时,该检查会被捕获?(弹出视图的ViewWillEnglish方法由于某种原因从未被调用。我确实读过,除非你转发该调用,否则不会被调用。)这听起来正确吗,有人有什么想法或建议吗?提前感谢。

当弹出或解除控制器时,将调用ViewWillEnglish&ViewDidEnglish。该函数在前视图控制器上调用,而不是在UINavigationController本身上调用。您是否可能子类化并忘记在某些方面调用super?

好的,如果您通过代码将UINavigationController添加到UIView,默认情况下,它不会将这些消息发送到其子视图。仅当UINavigationController本身接收到这些调用时,它才会执行此操作。也许这是你的问题(我不知道你的视图设置)

因此,在添加UINavigationController的视图时,请确保手动向其发送这些消息

UINavigationController *navigationController = [UINavigationController alloc] initWithRootViewController:rootViewController];

[navigationController viewWillAppear:NO];
[aView addSubview:navigationController.view];
[navigationController viewDidAppear:NO];

至少,这是我在开发过程中发现的。已经搜索了很长一段时间,我仍然不理解它背后的原理。

您可以始终隐藏默认的后退导航按钮,并使用自己的方法创建自己的按钮,以便在按下时调用

执行任意代码,然后弹出视图。

我使用了以下解决方案:

  • 在导航栏左侧添加自定义按钮
  • 让该按钮激活自定义方法
这种解决方法的缺点是:您将丢失漂亮的箭头形“后退”按钮。这也可以通过自定义图像来解决

这是我的代码。 将其放入您的viewDidLoad中:

// LeftButton in Navigation Bar
UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPushed:)];
self.navigationItem.leftBarButtonItem = leftBarButton;
[leftBarButton release]; 
然后在同一个.m文件中添加此方法:

- (void) backButtonPushed: (id)sender  {
// do what you want to do       
}
不要忘记在.h文件中

- (void) backButtonPushed: (id)sender;

查看
UINavigationControllerDelegate
。当UIViewController被推送到导航控制器堆栈时,只有两个方法被调用。类似地,如果一个正在被推,那么某个东西可能刚刚弹出。这就是我所谓的ViewDidEnglish和ViewWillEnglish

#pragma标记-UINavigationControllerDelegate方法
-(void)导航控制器:(UINavigationController*)导航控制器
willShowViewController:(UIViewController*)viewController已设置动画:(BOOL)已设置动画
{
静态UIViewController*vcPointer=nil;
//如果上一个视图控制器仍然存在,那么让我们发送一条ViewWillEnglish消息
如果(vcPointer!=nil){
if([vcPointer respondsToSelector:@selector(viewwilldemouse:)])){
[vcPointer VIEW将消失:动画];
}
}
//跟踪指向当前viewController的指针
vcPointer=视图控制器;
[视图控制器视图将显示:动画];
}

这段代码保留了一个指向最后一个被推送的视图控制器的指针引用,这样一旦我们推送另一个视图控制器,我们就可以弹出最后一个视图控制器(如果它仍然存在)。

是的,我也这么认为。我一直在读的很多东西都不是这样说的。是的,我想可能是这样的,我会尝试一下,让你知道它是否正确。我检查了一下,它对我有效。两个小的修正,这一行[navigationController视图将显示:否];应放在addView方法之后。我不认为ViewDidAspect方法是必要的。但是“will”事件的全部要点是它发生在你采取行动之前,因此我认为你的更正是无效的。我不需要明确地更改功能,因为它可以完美地工作。我只需要在导航控制器内的某个视图弹出时执行一个方法。。。