Iphone iOS-检测我是如何到达viewController的

Iphone iOS-检测我是如何到达viewController的,iphone,ios,ipad,Iphone,Ios,Ipad,我有3个按顺序显示的视图控制器,A->B->C A用电话呼叫B [self.navigationController pushViewController:controllerB animated:YES]; C打电话给B [self.navigationController popViewControllerAnimated:YES]; B有没有办法知道是谁叫它a还是C 谢谢。是的 创建一个@属性,其类型为UIViewController,名为coming from(或任何您想要的)。当你

我有3个按顺序显示的视图控制器,A->B->C

A用电话呼叫B

[self.navigationController pushViewController:controllerB animated:YES];
C打电话给B

[self.navigationController popViewControllerAnimated:YES];
B有没有办法知道是谁叫它a还是C

谢谢。

是的

创建一个
@属性
,其类型为
UIViewController
,名为
coming from
(或任何您想要的)。当你推它时,只需将它的属性设置为当前类。

是的


创建一个
@属性
,其类型为
UIViewController
,名为
coming from
(或任何您想要的)。推送时,只需将其属性设置为当前类。

您可以使用NavigationController视图控制器属性。查看导航堆栈中的项目

根视图控制器位于数组中的索引0处,后视图控制器位于索引n-2处,顶部控制器位于索引n-1处,其中n是数组中的项数

您希望视图控制器位于索引n-2处

编辑(添加示例)


您可以使用NavigationController视图控制器属性。查看导航堆栈中的项目

根视图控制器位于数组中的索引0处,后视图控制器位于索引n-2处,顶部控制器位于索引n-1处,其中n是数组中的项数

您希望视图控制器位于索引n-2处

编辑(添加示例)


当我重用视图控制器时,我可以想到的一种方法是在视图控制器上设置一个可以查询的属性。Alloc/init您的视图控制器,设置您的属性(NSString或NSInteger),并推送视图。这样,您就可以使用代码查询该属性,了解是谁创建和推送了视图


简单但有效。

我在重用视图控制器时使用的一种方法是在视图控制器上设置一个可以查询的属性。Alloc/init您的视图控制器,设置您的属性(NSString或NSInteger),并推送视图。这样,您就可以使用代码查询该属性,了解是谁创建和推送了视图


简单但有效。

是的,您可以创建一些枚举,比如ClassA和ClassC,在推送或弹出时只为该枚举分配相应的值。

是的,您可以创建一些枚举,比如ClassA和ClassC,在推送或弹出时只为该枚举分配相应的值。

如果B从A调用,-(void)viewDidLoad{方法将被调用,若B从C调用该方法,则该方法不应调用,所以您可以全局放置变量,并在viewDidLoad()方法中分配一些值。当你按下C键时,移除该值,然后在ViewWillExister方法中,你知道它的形式。

如果B从A调用,-(void)viewDidLoad{}方法将被调用,如果B从C调用该方法不应该调用,所以你可以全局放置变量,并在viewDidLoad()方法中赋值。当你按下C键时,去掉这个值,然后在视图中就会出现你知道的方法,它是形式。

我想你应该问自己的问题是“为什么B需要知道是谁叫的?”。我想你应该问自己的问题是“为什么B需要知道是谁叫的?”。谢谢,但我不明白。如果根视图控制器是0,并且在我的例子中假设它调用A,那么A=1,然后B=2和C=3。如果我假设B是n,那么A是n-1,C是n+1。这就是我的理解。所以,如果我来自C,就不会有n+1,因为C从数组中弹出。。。对吗?n-2将是称为B的视图。因此,在您的情况下,它应该显示A或C。n-2只是以前存在的视图,换句话说,当您按下导航栏中的“后退”按钮时,导航控制器将返回到的视图。我不确定我是否理解到创建代码的程度。。。但无论如何,谢谢。抱歉,我解释得很糟糕。我在我的帖子中添加了一个例子,应该会有所帮助。没问题,很高兴它有用。谢谢,但我不明白。如果根视图控制器是0,并且在我的例子中假设它调用A,那么A=1,然后B=2和C=3。如果我假设B是n,那么A是n-1,C是n+1。这就是我的理解。所以,如果我来自C,就不会有n+1,因为C从数组中弹出。。。对吗?n-2将是称为B的视图。因此,在您的情况下,它应该显示A或C。n-2只是以前存在的视图,换句话说,当您按下导航栏中的“后退”按钮时,导航控制器将返回到的视图。我不确定我是否理解到创建代码的程度。。。但无论如何,谢谢。抱歉,我解释得很糟糕。我在我的帖子中添加了一个例子,应该会有所帮助。没问题,很高兴它有用。
NSString *previousView = NSStringFromClass([[self.navigationController.viewControllers objectAtIndex:(self.navigationController.viewControllers.count - 2)] class]);
if([previousView isEqualToString:@"SettingsViewController"]){
     // Do something
}