无法从超级视图中删除(swift2)

Unable to remove from superview (swift2)

我无法使用以下代码从 superview 中删除? 这是为什么?我已经尝试了所有方法,但似乎它在 all.I 时不起作用,我正在添加更多详细信息,所以我没有收到这个非常烦人的警报,告诉我我的 post 主要是代码.. ..

   let controller = storyboard!.instantiateViewControllerWithIdentifier("OrderViewController")
            controller.view.frame = CGRectMake(self.view.frame.size.width/2 - 100, self.view.frame.size.height/2 - 100, 200, 200)

        if sender.selected {

            sender.selected = false

            controller.view.transform = CGAffineTransformIdentity

            [UIView .animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {

               controller.view.transform = CGAffineTransformMakeScale(0.01, 0.01);

                }, completion:  { finished in

               controller.willMoveToParentViewController(nil)
                controller.view .removeFromSuperview()
               controller.removeFromParentViewController()


            })]
            print("close")

        }

        else {

            sender.selected = true

           addChildViewController(controller)
            view.addSubview(controller.view)
            controller.didMoveToParentViewController(self)

          controller.view.transform = CGAffineTransformMakeScale(0.01, 0.01);
            [UIView .animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {

                controller.view.transform = CGAffineTransformIdentity

                }, completion: nil)]


          print("present")

        }

objective-c 语法(UIView 动画块周围的方括号)和 swift 的奇怪组合。如果编译没有错误,我会感到很惊讶!

您快完成了,主要问题是每次调用此代码块时,您都在实例化 'OrderViewController'.

的新实例

你只想在它不存在时创建它(当你想显示它时)。当您准备好隐藏它时,您想获取对现有控制器的引用并执行动画等操作来隐藏它。

为此,您需要在该代码块的本地范围之外保留对它的引用。

下面是一个示例,展示了您可以如何做到这一点:

import UIKit

class ViewController: UIViewController {

    // keep a reference to the OrderViewController after it's been created
    var controller:UIViewController?

    @IBAction func buttonTapped(sender: AnyObject) {

        // instead of using button selected state, just check to see if 
        // self.controller is nil or not

        if let existingController = self.controller {
            // controller already exists, lets hide it

            existingController.view.transform = CGAffineTransformIdentity

            UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {

                existingController.view.transform = CGAffineTransformMakeScale(0.01, 0.01);

                }, completion:  { _ in

                    existingController.willMoveToParentViewController(nil)
                    existingController.view.removeFromSuperview()
                    existingController.removeFromParentViewController()

                    // make this nil, so that next time the button is
                    // tapped we'll go though the process of creating it again
                    self.controller = nil

            })
            print("close")
        }
        else {
            // controller doesn't exist, lets instanstiate and show it

            let newController = storyboard!.instantiateViewControllerWithIdentifier("OrderViewController")

            newController.view.frame = CGRectMake(self.view.frame.size.width/2 - 100, self.view.frame.size.height/2 - 100, 200, 200)

            addChildViewController(newController)
            view.addSubview(newController.view)
            newController.didMoveToParentViewController(self)

            newController.view.transform = CGAffineTransformMakeScale(0.01, 0.01)

            UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {

                newController.view.transform = CGAffineTransformIdentity

                }, completion:  { _ in

                    // keep a reference to this controller you've just created,
                    // so that next time the button is tapped you can close it
                    self.controller = newController
            })

            print("present")

        }
    }
}

如果您正在开发一个非常简单的应用程序(只有几个屏幕),那么这种方法就可以了。

但是....如果您打算做一些更复杂的事情,您可能想要使用自定义 UISegueUIPresentationControllerUIViewControllerAnimatedTransitioning 的组合进行调查,所以所有这些动画逻辑都不会锁定在您的视图控制器代码中。