【问题标题】:Detect that from which Page I come to the current Page检测我从哪个Page来到当前Page
【发布时间】:2017-07-12 11:18:49
【问题描述】:

我想知道怎么做:

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

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

【问题讨论】:

  • 您可以维护布尔变量 isFromFirst 以在导航时检测并传递真假
  • 我的应用中没有导航 我编辑了问题
  • 如果您没有导航,那么您是如何导航的?您能否详细说明并向我们展示一些代码 sn-p 以便为您提供适当的帮助?
  • 我有 TabBar 和一些将我带到另一个页面的代码 我想使用它,例如,如果我从第 1 页到第 3 页显示一些东西,如果我从第 2 页到第 3 页显示我还有别的事
  • 我想写一些打印最后一页的东西

标签: ios uiviewcontroller swift3 viewcontroller


【解决方案1】:

有很多方法可以做到这一点,比如简单地将视图控制器作为属性传递给新实例。但在您的情况下,创建一个静态变量可能更有意义,该变量以与导航控制器相同的方式保存视图控制器的堆栈。

如果您只在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. 如果你从控制器ABC 再回到B,那么之前的视图控制器是C,而不是A。这可能是预期的结果,也可能不是。
  3. 系统将忽略所有其他视图控制器。因此,如果您使用的不是TrackedViewController 的子类,则调用将被忽略:ABUITableViewControllerC 将报告CB 提供,即使中间还有另一个屏幕。同样,这可能是预期的结果。

所以如果第 2 点和第 3 点对您有好处,那么您应该只决定天气来修复第 1 点。您可以使用weak 删除两个属性的保留,但您会丢失之前视图的信息如果控制器被释放,控制器。所以另一种选择是使用一些标识符:

class TrackedViewController : UIViewController {

    static var currentViewControllerID: String?
    static var previousViewControllerID: String?

    override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
        TrackedViewController.previousViewControllerID = TrackedViewController.currentViewControllerID
        TrackedViewController.currentViewControllerID = self.screenIdentifier
    }

    var screenIdentifier: String {
        return "Default Screen" // TODO: every view controller must override this method and have unique identifier
    }

}

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

【讨论】:

  • 我测试了它并且它有效。尽管硬写的代码无法编译。让我解决它...
  • 我只是想使用这个功能(如果上一页是例如 myView Controller { print("OK") }
【解决方案2】:

我不知道我的回答是否会对您的具体情况有所帮助,但这是我从您的要求中看到的实现。也许它会激励你。

所以想象一下你在你的主页或任何 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

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 2020-09-05
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-12-21
    相关资源
    最近更新 更多