我是OOP和Swift的新手,在调用其他类中的IBOutlet
时遇到问题。
我已经为IBOutlet
声明了var UIImageView
:
class ViewController: UIViewController {
@IBOutlet weak var deleteImageView: UIImageView!
...
}
而且我想在将圆作为视图的子视图绘制的类CircleView
中使用它。我的目标是知道所创建的圆与我的deleteImageView
相交时将其删除:
class CircleView: UIView {
@objc func didPan(panGR: UIPanGestureRecognizer) {
...
switch panGR.state {
case .began, .changed:
...
case .ended:
if self.frame.intersects(deleteImageView.frame) {
self.removeFromSuperview()
}
break
default:
break
}
}
}
在case .ended
中,我想访问deleteImageView
,但我不知道如何操作。我也尝试在vc中创建一个函数,该函数接受UIView
(圆圈)作为参数,并从我的CircleView
调用它,但出现错误。这是我尝试过的下一件事:
class ViewController: UIViewController {
@IBOutlet weak var deleteImageView: UIImageView!
...
func deleteSubView(subView: UIView) {
if subView.frame.intersects(deleteImageView.frame) {
subView.removeFromSuperview()
}
}
以及在开关部分的CircleView
中:
case .ended:
ViewController.deleteSubView(subView: self)
错误:
类型'ViewController'没有成员'deleteSubView'
我该如何调试?
将UIPanGestureRecognizer移至视图控制器。
圆形视图不应控制任何内容,而应仅创建要显示的视图。
通常,您不应该从视图访问另一个类(包括父视图控制器的)IBOutlets。
视图控制器应进行控制。 :-)
感谢您提供所有答案,我稍微更改了代码,现在在CircleClass中,我只调用了ViewController中的一个函数。
是这样的:
class CircleView: UIView {
var vc = ViewController()
....
@objc func didPan(panGR: UIPanGestureRecognizer) {
...
switch panGR.state {
case .began, .changed:
//drags the circle
case .ended:
//when dragging ended check if the circle subViewIntersects with
//trashImageView
vc.deleteSubView(subView: self)
...
}
}
以及在ViewController中:
class ViewController: UIViewController {
@IBOutlet var trashImageView: UIImageView!
...
func deleteSubView(subView: UIView){
//let deleteFrame = CGRect(x: 688.0, y: 924.0, width: 80.0, height: 100.0)
print("my image view: \(trashImageView.frame)")
if (subView.frame.intersects(trashImageView.frame)) {
print("intersection")
print("my imageView inters: \(trashImageView.frame)")
subView.removeFromSuperview()
}
}
事实是,当我为垃圾桶ImageView(deleteFrame)初始化一个CGRect时,它工作得很好,消除了subView,但是当我尝试使用trashImageView.frame我收到此错误:
线程1:致命错误:意外地发现nil,同时隐式展开一个可选值
当我在'viewDidLoad()中使用“ trashImageView.frame”时,我可以打印CGRect,但是在我的函数deleteSubView中(也在ViewController中)我得到的是nil。
我该怎么办,如果我俩都在ViewController中并且imageView随时都未移动,则可以从deleteSubView函数中的trashImageView中获取CGRect。