Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否';pushViewController';是否阻止ViewController调用Denit?_Ios_Swift_Swift3_Uinavigationcontroller - Fatal编程技术网

Ios 是否';pushViewController';是否阻止ViewController调用Denit?

Ios 是否';pushViewController';是否阻止ViewController调用Denit?,ios,swift,swift3,uinavigationcontroller,Ios,Swift,Swift3,Uinavigationcontroller,我有几个视图控制器(UIViewController)每个视图控制器都有自己的情节提要。我希望应用程序在从一个视图控制器转换到另一个视图控制器时调用deinit。但不会 该应用程序以HomeViewController启动。当用户点击按钮(UIButton)时,它将转换为SelectViewController 该应用程序在离开HomeViewController时从不调用Denit。我想知道这是否是因为它正在推一个视图控制器?如果我按如下方式设置视图控制器,应用程序将崩溃。我做错了什么?我从来

我有几个视图控制器(
UIViewController
每个视图控制器都有自己的
情节提要
。我希望应用程序在从一个视图控制器转换到另一个视图控制器时调用
deinit
。但不会

该应用程序以HomeViewController启动。当用户点击按钮(
UIButton
)时,它将转换为SelectViewController

该应用程序在离开HomeViewController时从不调用Denit。我想知道这是否是因为它正在推一个视图控制器?如果我按如下方式设置视图控制器,应用程序将崩溃。我做错了什么?我从来没有用过不同的故事板。谢谢

class HomeViewController: BasicViewController {
    @IBAction func selectTapped(_ sender: UIButton) {
        let storyboard = UIStoryboard(name:"Select",bundle:nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "SelectView") as! SelectViewController
        self.navigationController?.setViewControllers([viewController], animated: true)  
    }
}
更新1

我想是这样的

@IBAction func selectTapped(_ sender: UIButton) {
    let storyboard = UIStoryboard(name:"Select",bundle:nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "SelectView") as! UINavigationController
    self.present(controller, animated: true, completion: nil)
}
更新2 当SelectViewController出现时,我也会清除视图控制器堆栈,如下所示

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

    var navigationArray = self.navigationController?.viewControllers
    navigationArray?.removeAll()
}

事实上,这与故事板无关。根据苹果的文档,“deinit”方法在对象从内存中释放时自动调用,而不是在视图控制器从当前视图控制器中推送时

当您从“HomeViewController”中按“SelectViewController”时,“HomeViewController”的实例不会从内存中释放,因此不会调用deinit方法


这是一个苹果的文档去初始化的例子。或者,如果满足您的需要,您可以使用视图控制器的“ViewDidEnglishe”方法来执行操作。

从您的代码片段中,我知道您希望在pushViewController之后调用deinit。但是,通过调用pushViewController,导航控制器将HomeViewController推送到导航堆栈,这意味着导航控制器保留对HomeViewController对象的强引用。所以,Denit不被称为。如果不需要HomeViewController,则必须手动将其从导航堆栈中删除,并选择ViewController。 看看这个

在SelectViewController中

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  let allControllers = NSMutableArray(array: navigationController!.viewControllers)
  allControllers.removeObject(at: allControllers.count - 2)
  self.navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
}

您可以使用从一个故事板到下一个故事板的故事板引用-无需在code@Ashley米尔斯:谢谢你的小费。当一个视图控制器有自己的故事板时,您可以从一个视图控制器转换到另一个视图控制器,而无需编写代码?如何?将“情节提要引用”拖到第一个情节提要上-设置与第二个情节提要上的视图控制器对应的值。从你的按钮拖出一个链接到参考。嗯。。。我对故事板参考资料一无所知。非常感谢。使用故事板参考可以使应用程序从一个视图控制器过渡到另一个视图控制器。但我也想知道如何在代码中实现它。谢谢那么如何从内存中删除HomeViewController?@ElTomato您不应该从内存中删除此视图控制器。您可以从导航数组中删除视图控制器的对象,但根据我的说法,这是不合逻辑的。你能告诉我你的具体要求吗?如果可能的话,我可以给你合适的解决方案。谢谢。但这可能无法解决我的Denit问题,因为我甚至使用SelectViewController的ViewWillDisplay.Hmm从堆栈中调用remove all view Controller。。这很奇怪,因为我是按照我写的那样做的,但是我删除了w/在viewdide中。据我所知,在调用上一个控制器的VIEWDID消失之前,将调用下一个控制器的VIEWWILLEASE。你可以很容易地检查它。
override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  let allControllers = NSMutableArray(array: navigationController!.viewControllers)
  allControllers.removeObject(at: allControllers.count - 2)
  self.navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
}