Swift-从另一个类调用IBOutlets变量

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

我是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'

我该如何调试?

ios swift iboutlet
2个回答
0
投票

将UIPanGestureRecognizer移至视图控制器。

圆形视图不应控制任何内容,而应仅创建要显示的视图。

通常,您不应该从视图访问另一个类(包括父视图控制器的)IBOutlets。

视图控制器应进行控制。 :-)


0
投票

感谢您提供所有答案,我稍微更改了代码,现在在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。

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