【问题标题】:Are specific instances of a view controller accessible without the use of singletons?是否可以在不使用单例的情况下访问视图控制器的特定实例?
【发布时间】:2017-08-22 15:12:21
【问题描述】:

当 UINavigationController 将视图控制器推送到视图中时,导航控制器会在后台创建自己的视图控制器实例。使用这个导航控制器委托:

extension Main_ProfileViewController: UINavigationControllerDelegate {

    // called just after the navigation controller displays a view controller’s view and navigation item properties
    open func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        print(viewController)
    }

}


该实例可以是“确定的”。控制台打印如下内容:

<ElChapo.SomeRandomViewController: 0x7fbe8b003640>

每次导航控制器推送视图控制器时,14 个字符的哈希值都是不同的,因此很明显它们每次都是不同的实例。我的问题:该特定实例是否可以在不使用单例的情况下以某种方式访问​​?可访问性是指可访问性,我可以在其中运行委托并在该特定实例中调用特定方法。

这就是我想要完成的:

要将导航堆栈弹出回其根目录,我将从堆栈顶部的视图控制器中执行此函数。

// pop to root
func popToRoot() {
    self.navigationController?.popToRootViewController(animated: true)
}

此方法必须从该视图控制器的特定实例中调用。如果我从另一个对象(例如选项卡栏)调用 popToRoot(),通过将委托传递给它,它不起作用,因为委托需要找到确切的实例来执行弹出。

【问题讨论】:

  • 阅读这篇文章:stackoverflow.com/questions/5210535/… 这应该会给你很多信息。
  • 您能解释一下为什么需要为视图控制器的特定实例调用委托吗? UIViewController 有一个生命周期。因此,您可以使用它来执行自定义操作。此外,如果您的模型没有改变,您可以在每次创建控制器的新实例时重新创建具有相同状态的控制器。这可以通过注入来实现。否则,您可以使用控制器协调器来实现您想要的,而无需使用单例。协调器是一种入口点,用于存储导航控制器将呈现的控制器。
  • 正如@DonMag 所说,您的问题的答案是肯定的。如果您提供有关您尝试完成的确切功能的更多详细信息,我们可能会提供更多有用的答案。
  • 这个问题是我上一个问题的一个分支:stackoverflow.com/questions/45808032/…
  • 请在此处提供所有需要的信息。谢谢。

标签: ios swift uinavigationcontroller delegates singleton


【解决方案1】:

导航控制器不会“创建自己的实例”,或者至少这是一种有点混乱的看待它的方式。只有在您使用情节提要时才会出现这种情况。如果您愿意,您可以使用导航控制器而不使用情节提要,在这种情况下,您将手动实例化一个新的视图控制器以推送到导航控制器堆栈。如果您使用情节提要,它将包含已定义的 segue,这会“导致”下一个视图控制器被推入堆栈。故事板中的 segues 定义了何时创建哪些视图控制器。无需创建单例来“访问”推送到导航堆栈的子视图控制器。每次将一个推入导航控制器的堆栈时,默认情况下都会创建它,当它弹出时,除非您特别维护对它的强引用(这几乎总是一个坏主意),否则它将被销毁。

如果您还没有子类化导航视图控制器,请这样做,并在子类中覆盖 prepare(for:sender:) 以便能够从导航控制器访问推送到的子视图控制器的实例导航控制器的堆栈。如果您想访问该视图控制器,请在该方法中保存对它的引用,或者更好的是,使用导航控制器的以下属性之一在导航控制器堆栈中找到它:

var topViewController: UIViewController?
var visibleViewController: UIViewController?
var viewControllers: [UIViewController]

顺便说一句,您引用的参考号不是哈希,而是视图控制器对象存储位置的指针(例如内存地址)的十六进制值,但正如您所说,不同的视图控制器将具有不同的十六进制值。

【讨论】:

猜你喜欢
  • 2022-06-27
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2011-09-11
  • 2013-01-08
  • 2020-09-17
相关资源
最近更新 更多