代码之家  ›  专栏  ›  技术社区  ›  user7804097

展开多个导航控制器

  •  1
  • user7804097  · 技术社区  · 8 年前

    假设我有视图控制器A、B和;C嵌入在导航控制器中。在C中,我为一个单独的逻辑流提供了一个新的导航控制器,但需要在完成后返回到a。因此,应用程序流程如下:A->B->C—以模式显示新的导航控制器—D—>E->F、 然后从F回到A。

    我已经设置了一个放松序列,然而,放松序列只会将我带回D,即使我已经将其设置为返回A。

    我怎样才能让它一路放松回到A?我是否错过了一些我看不到的东西?非常感谢。

    A内部:

        @IBAction func unwindToHome(segue:UIStoryboardSegue){}
    

    然后,我将控件从F拖到其“出口”,并选择我在A中创建的展开序列,并编写以下序列代码:

        private let SEGUE_TO_HOME = "unwindToHome"
        performSegue(withIdentifier: SEGUE_TO_HOME, sender: nil)
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Rob Md Fahim Faez Abir    8 年前

    当您展开时,它应该返回视图控制器链,通过所有这些导航控制器和模式演示,一直到执行此展开操作的视图控制器。

    有没有可能 unwindToHome 在除?这是我能看到的唯一方法,放松动作不会让你一直回到A。我想知道,例如,D是否有自己的 解绑回家 动作(或者可能是与相同类型的另一个实例)。总之,我无法复制你描述的行为,除非通过类似的方式。

    您随后询问:

    我放了一个 deinit 方法。我只印了他们所有人的名字。当它回到A时,“gone”只打印两次。解绑段不是解除分配所有实例吗?

    是的,它们都应该被解除分配。如果不是,则调试内存图 debug memory graph button (参见 https://stackoverflow.com/a/30993476/1271826 )非常擅长显示哪些内容保留了对未分配内容的有力引用。最有可能的是,这些未解除分配的视图控制器有一些延迟的强引用周期、重复的计时器引用,或者类似于分别对每个视图控制器保持强引用的情况。

        2
  •  0
  •   Charles Kenney    8 年前

    您可以通过为第二个导航控制器创建子类,简单地创建对控制器a-C嵌入的第一个导航控制器的引用。

    class SecondNavController: UINavigationController {
    
      // getter for previous nav controller
      var prevNavController: UINavigationController? {
        return parent?.navigationController
      }
    
    }
    

    当您需要放松时,只需:

    class FController: UIViewController {
    
      // other code
    
      func unwindToRootController() {
        guard let navController = navigationController as? SecondNavController,
          let prevNavController = navController.prevNavController else {
          return
        }
        navigationController.popToRootViewController(animated: true)
      }
    
    }