【问题标题】:How to remove a VC then add another VC directly afterward如何删除一个 VC 然后直接添加另一个 VC
【发布时间】:2017-12-18 10:06:34
【问题描述】:

我有一个主 VC(称为 VC A),它有一个子 VC(VC B)。当我点击 VC B 上的按钮时,我将其作为子 VC 关闭,但是一旦完成,我想实例化另一个 VC(VC C)。我通过在 VC B 上创建一个 bool 来做到这一点,如果 true 调用 VC A 上的一个函数来创建一个新的子 VC (VC C)。所有的函数调用都在进行,但是 VC C 永远不会被添加。下面我添加了代码:

VC B:

 func removeAnimate()
{

    self.willMove(toParentViewController: nil)
    self.view.removeFromSuperview()
    self.removeFromParentViewController()

    didTransition = true

    if didTransition == true {
       callAddVC()
    }

}

func callAddVC() {
    let instVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainViewController") as! MainViewController

    instVC.addVC()
}

VC A:

  func addVC () {


    let popvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CommentsTabViewController") as! CommentsTabViewController

    self.addChildViewController(popvc)
    popvc.view.center = self.view.center

    popvc.view.bounds.size = CGSize(width: 337, height: 503)

    self.view.addSubview(popvc.view)

    popvc.didMove(toParentViewController: self)
            }

【问题讨论】:

  • 如何添加初始弹出框?
  • 加载 VC A 后在 addVC() 函数中使用相同的代码

标签: ios swift3 uiviewcontroller childviewcontroller


【解决方案1】:

让 instVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainViewController") as!主视图控制器

这一行创建(实例化)您的 MainViewController 的新实例,它不是您当前显示的 MainViewController。

您需要维护对第一个 MainViewController 的引用(可能通过访问主窗口上的 rootViewController。并将新的弹出框添加到其中。

【讨论】:

    【解决方案2】:

    您正在callAddVC() 上创建ViewController A (MainViewController) 的新实例,这是错误的。您没有使用ViewController A的现有实例

    您必须在添加Viewcontroller B 时传递Viewcontroller A 实例

    视图控制器 A

      let viewControllerB = // Get the instance of UIViewControllerB from storyboard
      viewControllerB.vcA = self
    

    视图控制器 B

      class UIViewControllerB {
            weak var vcA: UIViewControllerA?
    
             func removeAnimate() {
    
                  self.willMove(toParentViewController: nil)
                  self.view.removeFromSuperview()
                  self.removeFromParentViewController()
    
                  didTransition = true
    
                 if didTransition == true {
                   vcA.addVC(). //You have to call addVC() by using the reference of the main view controller.
                 }
               }
    
         }
    

    【讨论】:

    • 非常感谢您的回答!为了清楚起见,我认为在实例化新 VC 时会引用它,但这表明我实际上是在创建副本?
    • 不是“复制”,相当于要一行代码let vcA = MyVC()let vcB = MyVC()。这是2个不相关的实例。 “复制”一词意味着一个来自另一个。
    • @NightHawk95 当分配一个新的 VC 时,它指向不同的内存位置。您必须传递已分配的引用。
    • 好的,谢谢您的澄清!有没有什么地方可以找到更多关于这些机制的文献?
    • @NightHawk95 storyboard.instantiateViewController(_) 将分配一个新实例,它不会指向现有实例
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多