我在NavigationController设置中有很多ViewControllers,并且想知道当用户点击“返回”时是否可以运行代码。
基本上我的应用程序运行测试,我想“退回”也停止测试。我知道我可以添加一个单独的停止按钮,但这会更顺畅。
由于
编辑:
我已添加:
-(void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if ([[StdTCPTestViewController class] isSubclassOfClass:[ViewController class]])
NSLog(@"We are going back to VC1");
}
到我的代码但是一旦视图加载就会调用它,而不是在按下后退按钮时调用。在下面的示例中,StdTCPTestViewController是VC2,ViewController是VC1。 NavController - VC1 - VC2是层次结构,segue从VC1推送到VC2。
还有其他调整吗?
答案 0 :(得分:2)
假设您在导航控制器堆栈中有2个VC:
每次将VC2“推”到导航控制器堆栈上时:调用VC2的viewDidLoad。每次“弹出”时,视图都会被卸载。另一方面,堆栈上的VC1不会调用它的viewDidload(当VC2弹出时),因为VC1仍然在内存中加载(记住你在VC1之上推VC2所以VC1必须留在内存中!)
所以在某种程度上,如果你想在按下后退按钮时执行一些代码,你应该把这些代码放在VC1的viewDidAppear(或viewWillAppear)方法中。
现在,如果您要编写的代码必须在弹出之前在VC2上执行,那么您可以在VC2中使用:
-(void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if ([[viewController class] isSubclassOfClass:[VC1 class]])
NSLog(@"We are going back to VC1");
}
这是一个UINavigationController委托方法,因此VC2必须通过在.h文件的@interface行末尾添加UINavigationControllerDelegate来采用该协议:
@interface VC2 : UIViewController <UINavigationControllerDelegate>
你必须将VC2设置为UINavigationController的委托,所以你必须放入VC2的viewDidLoad:
self.navigationController.delegate=self;
您显然还需要将VC1.h文件导入VC2,因为您在上面的委托方法代码中引用它。
希望这有帮助