当我点击屏幕左上角的橙色按钮一时,我的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()
}
}
你得到了一个崩溃,因为你正在创建一个新的实例的 TestViewController
在 DropDownViewController
并称 closeDropDownView
方法上的那个特定的实例(testVC
). 在一个新的 TestViewController
的 @IBOutlet var dropDownView
是空的,因此你会得到一个崩溃。为了避免崩溃,你需要传递相同的 TestViewController
到 DropDownViewController
来调用完全相同的 closeDropDownView
以获得同样的功能,而不是崩溃。