检测从哪个页面到达当前页面

时间:2017-02-22 12:04:42

标签: ios uiviewcontroller swift3 viewcontroller

我想知道如何做到这一点:

我有3个视图控制器,第一个和第二个视图控制器连接到第三个! 我想知道如何编写一个代码来检测我来自哪个视图控制器

我在这里搜索了我的答案但所有类似的问题都询问了导航! 重要的是我的应用程序中没有导航!

2 个答案:

答案 0 :(得分:0)

有很多方法可以将视图控制器作为属性传递给新实例。但在你的情况下,创建一个静态变量可能更有意义,该变量保存视图控制器的堆栈,就像导航控制器那样。

如果您只在UIViewController子类之间执行此操作,我建议您创建另一个子类,其他所有视图控制器都继承该子类。我们称之为TrackedViewController

class TrackedViewController : UIViewController {

    static var currentViewController: TrackedViewController?
    static var previousViewController: TrackedViewController?

    override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

        TrackedViewController.previousViewController = TrackedViewController.currentViewController
        TrackedViewController.currentViewController = self
    }
}

现在您需要更改要跟踪的所有视图控制器,以便它们都从TrackedViewController继承为class MyViewController : TrackedViewController {。这就是它。现在,您可以在项目的任何位置通过TrackedViewController.currentViewController和之前的视图控制器TrackedViewController.previousViewController找到当前的视图控制器。所以你可以这样说:

if let myController = TrackedViewController.previousViewController as? MyViewController {
    // Code here if the screen was reached from MyViewController instance
}

现在我做的方式是通过视图控制器的实例,它可能有一些副作用。

  1. 您可能遇到的最大问题是前一个控制器与当前视图控制器一起被保留。这意味着你可能在内存中有2个你不需要的控制器。
  2. 如果您从控制器A转到B再转到C并返回B,那么之前的视图控制器为C,而不是A }。这可能是期望的结果。
  3. 系统将忽略所有其他视图控制器。因此,如果您使用的不是TrackedViewController的子类,则会忽略该调用:ABUITableViewControllerC会报告{ {1}}由C呈现,即使其间有另一个屏幕。这可能是预期的结果。
  4. 因此,如果第2点和第3点对您有好处,那么您应该只决定天气以确定点1.您可以使用B删除两个属性上的保留但是您丢失了如果控制器已取消分配,则为先前的视图控制器。所以另一种选择是使用一些标识符:

    weak

    您也可以用一些枚举或其他东西替换字符串。将它们与一些相关值组合在一起可以创建一个非常强大的工具。

答案 1 :(得分:0)

我不知道我的答案是否会在你的具体情况下对你有所帮助,但这是我从你所要求的实施中得到的实施。也许它会激励你。

所以想象一下你的主页或者任何viewController,你想要导航其他,但你想知道你来自哪个viewController。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:segue_VC1]) {
        CustomViewController1* destinationVC = segue.destinationViewController;
        destinationVC.fromSegue = @"I AM VC 1";
    }
    if ([segue.identifier isEqualToString:segue_VC2]) {
        CustomViewController2* destinationVC = segue.destinationViewController;
        destinationVC.fromSegue = @"I AM VC 2";
    }
}

您必须知道的更重要的是,您可以从您将使用segue访问的目标视图控制器访问属性。

我知道这是在Obj C中,但实现仍然是相同的。

因此,当您从ViewController导航到另一个ViewController时,您可以设置destinationViewController的属性。

然后,当您在想要导航的视图控制器中时,您可以检查:

if ([_fromSegue isEqualToString: "I AM VC 1"])
  // do specific stuff when you come from VC 1
else if ([_fromSegue isEqualToString: "I AM VC 2"])
  // do specific stuff when you come from VC 2
else
  // other case