Swift: 点buttonOne隐藏视图正常,点buttonTwo隐藏同一个视图,应用崩溃...?

问题描述 投票:0回答:1

enter image description here

当我点击屏幕左上角的橙色按钮一时,我的collectionView出现了,当我再次点击橙色按钮一时,collectionView消失了。这样做很好,但是现在......如你所见,collectionView也有很多按钮,当我按下其中一个按钮时,它调用了与orangeButtonOne完全相同的方法,即closeDropDownView。然而,当我点击CollectionView中的按钮时,应用程序在第99行崩溃......我得到以下错误。

class TestViewController: UIViewController {
 @IBOutlet weak var dropDownView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        dropDownView.isHidden = true

    func closeDropDownView() {

        UIView.animate(withDuration: 0.3, delay: 0, options: .curveLinear, animations: {

99          var dropTopFrame = self.dropDownView.frame <THREAD1: FATAL ERROR: UNEXPECTEDLY FOUND NIL WHILE IMPLICITLY UNWRAPPING AN OPTIONAL VALUE
            var dropBottomFrame = self.dropDownView.frame

          dropTopFrame.origin.y += dropBottomFrame.size.height
          dropBottomFrame.origin.y -= dropTopFrame.size.height

          self.dropDownView.frame = dropTopFrame
          self.dropDownView.frame = dropBottomFrame

            UIView.animate(withDuration: 0.5) {
                self.dimView.alpha = 0

            }

        }, completion: { finished in
            self.dropDownView.isHidden = true
          print("dropView closed!")
        })
    }
}

我不明白为什么当orangeButtonOne调用这个方法时,这个方法工作得很好,但是当一个collectionView按钮调用这个方法时,框架值突然变成了零?

下面是每个按钮调用closeDropDownView方法的过程。

class TestViewController: UIViewController {
//viewDidLoad etc

    @IBAction func orangeButtonOneTapped(_ sender: Any) {

        if (dropDownView.isHidden == true ) {

            openDropDownView()
        }
        else { closeDropDownView() }
}
extension DropDownViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

let testVC = TestViewController()


       @objc func CVButtonTapped(sender: UIButton!) {
           print("button tapped")

        testVC.closeDropDownView()
}
}
swift uiview uicollectionview uibutton
1个回答
1
投票

你得到了一个崩溃,因为你正在创建一个新的实例的 TestViewControllerDropDownViewController 并称 closeDropDownView 方法上的那个特定的实例(testVC). 在一个新的 TestViewController@IBOutlet var dropDownView 是空的,因此你会得到一个崩溃。为了避免崩溃,你需要传递相同的 TestViewControllerDropDownViewController 来调用完全相同的 closeDropDownView 以获得同样的功能,而不是崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.