从子级ViewController进行检举

时间:2020-05-18 02:11:08

标签: swift segue viewcontroller unwind-segue removefromsuperview

我遇到将子视图控制器“ 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个插座,并将上面的代码放入其中?

1 个答案:

答案 0 :(得分:1)

更新:我能够通过从按钮上拆下5个推送按钮来进行修复,并使5个推送按钮中的每一个都直接从视图控制器B转到视图控制器C The 5 segues from view controller B to view controller C。然后,每个按钮都有一个@IBAction,在视图控制器B中有以下代码:

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)
    }
}

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

相关问题