如何知道哪个视图被推送到某个视图

时间:2014-07-24 18:23:50

标签: ios objective-c uiviewcontroller

这是我的问题:

我有3个不同的UIViewControllers;

第一个是A,第二个是B,第三个是C.

A推送到B,然后我在ViewDidLoad方法中做了一些事情。 C也有一个到B的segue然后i =我需要在ViewDidLoad方法中做其他的事情。

有没有办法知道哪个UIViewController A或C推到了B?

3 个答案:

答案 0 :(得分:3)

你可以在B类的.h文件中拥有一个属性,如下所示:

@property (nonatomic) NSString *viewControllerName;

在A类和C类的-prepareForSegue:方法中,您可以将viewControllerName属性设置为等于A类的名称或C类的名称。
然后,在B类viewDidLoad中进行简单的if-else检查可以帮助您相应地加载它。

示例B.h:

#import <UIKit/UIKit.h>

@interface B : UIViewController 

@property (nonatomic) NSString *view;

@end

示例C.m或A.m

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
        B *vc = [segue destinationViewController];
        vc.view = @"C"; // Change to A if this is in A.m
}

答案 1 :(得分:1)

是的。在导航堆栈中,您将能够跟踪哪个视图推送了当前视图

NSArray * arr = [self.navigationController ViewControllers];

如果您打印他的数组,您将获得导航堆栈中所有viewCOntroller的回溯

答案 2 :(得分:1)

在B类的.m中,我们可以调用它ViewController_B.m

#import "ViewController_A.h"
#import "ViewController_C.h"

//...

-(void)viewDidLoad
{
    //...

    NSArray *arrViewControllers = self.navigationController.viewControllers;

    if (arrViewControllers.count <= 1) { //not needed but just incase, maybe?
        NSLog(@"No parent");
        return;
    }

    id vcCurrent = arrViewControllers[arrViewControllers.count-2];
    if ([vcCurrent isKindOfClass:[ViewController_A class]]) {
        NSLog(@"Pushed by A");
        //Do class A specific things

    }
    else if ([vcCurrent isKindOfClass:[ViewController_C class]]) {
        NSLog(@"Pushed by C");
        //Do class C specific things

    }
}

但是,我从未这样做过。
我会在B类中保留一个参数来确定加载它的逻辑。 (正如@WyattMufson在他的answer above/below中所建议的那样)