【问题标题】:Segueing from Child ViewController从子 ViewController 进行 Segue
【发布时间】:2020-09-03 18:23:05
【问题描述】:

我有一种情况,我将一个子视图控制器“B”呈现到另一个视图控制器“A”上。视图控制器“B”有 5 个按钮,这些按钮可以连接(推送)到第三个视图控制器“C”。问题是,一旦我在视图控制器“C”处,我希望能够使用展开转场从 C-->A 开始,而 B 不会出现在中间。

    // view controller A class

    class AViewController: UIViewController {        

            @IBAction func goToViewControllerB(_ sender: UIButton) {
                   let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "viewControllerB_ID") as! BViewController
                   self.addChild(viewControllerB)
                   viewControllerB.view.frame = self.view.frame
                   self.view.addSubview(viewControllerB.view)
                   viewControllerB.didMove(toParent: self)
           }

           @IBAction func unwindToStart(segue: UIStoryboardSegue) {
                  print("back from view controller C!")
           }

   }

   //view controller B class

   class BViewController: UIViewController {

           override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                  if let identifier = segue.identifier {
                        switch identifier {
                              case "segueFromBToC_1":
                                    if let destVC = segue.destination as? CViewController {
                                        //pass data
                                    }
                              // ... cases 2-4
                              case "segueFromBToC_5":
                                    if let destVC = segue.destination as? CViewController {
                                        //pass data
                                    }
                              default: break
                         }                   
                  }
          }

    }

    // empty CViewController class

我知道将以下代码放在我的视图控制器 B 类中会将其从父视图控制器“A”中删除,但是我不能再从“B”切换到“C”,因为“B”没有'不存在。

   self.view.removeFromSuperview()
   self.removeFromParent()
   self.willMove(toParent: nil)

我想知道我应该把上面的代码放在哪里,或者我是否应该从子视图控制器中分离出来?我也没有使用导航控制器,因为我不知道如何使用子视图控制器来实现它们。我应该为 5 个按钮中的每一个设置 @IBAction 插座并将上面的代码放在那里吗?

【问题讨论】:

    标签: swift segue viewcontroller unwind-segue removefromsuperview


    【解决方案1】:

    更新:我能够通过从按钮上分离 5 个推送 segues 并让 5 个推送 segues 中的每一个直接从视图控制器 B 到视图控制器 C 来修复它。然后,我在视图控制器 B 中有以下代码的每个按钮都有一个 @IBAction

    class BViewController: UIViewController {
    
           @IBAction func button1ToVC3(_ sender: UIButton) {
              segueAndRemoveSelf(segueName: "segueFromBToC_1")
          }
    
          @IBAction func button2ToVC3(_ sender: UIButton) {
             segueAndRemoveSelf(segueName: "segueFromBToC_2")
          }
    
          @IBAction func button3ToVC3(_ sender: UIButton) {
             segueAndRemoveSelf(segueName: "segueFromBToC_3")
          }
    
          @IBAction func button4ToVC3(_ sender: UIButton) {
             segueAndRemoveSelf(segueName: "segueFromBToC_4")
          }
    
          @IBAction func button5ToVC3(_ sender: UIButton) {
             segueAndRemoveSelf(segueName: "segueFromBToC_5")
          }
    
           override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                  if let identifier = segue.identifier {
                        switch identifier {
                              case "segueFromBToC_1":
                                    if let destVC = segue.destination as? CViewController {
                                        //pass data
                                    }
                              // ... cases 2-4
                              case "segueFromBToC_5":
                                    if let destVC = segue.destination as? CViewController {
                                        //pass data
                                    }
                              default: break
                         }                   
                  }
          }
    
    }
    
    extension BViewController {
        func segueAndRemoveSelf(segueName: String) {
            self.performSegue(withIdentifier: segueName, sender: self)
            self.view.removeFromSuperview()
            self.removeFromParent()
            self.willMove(toParent: nil)
        }
    }
    

    但不确定这是否是最佳做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多