我处于将子视图控制器“ 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”没有,我再也无法从“ B”切换到“ C”了。不存在。
self.view.removeFromSuperview()
self.removeFromParent()
self.willMove(toParent: nil)
我想知道上面的代码应该放在哪里,或者是否应该从子视图控制器中查询?我也没有使用导航控制器,因为我不知道如何使用子视图控制器来实现它们。我是否应该为5个按钮中的每个按钮设置@IBAction
插座,然后在其中放置上面的代码?
更新:我能够通过从按钮上拆下5个推送按钮来进行修复,并使5个推送按钮中的每一个都直接从视图控制器B转到视图控制器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)
}
}
虽然不确定这是否是最佳实践。