[在函数中调用IBOutlet属性时获取Nil

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

我正在迅速工作,我正在尝试使用.frames检查2个CGRect类型的对象是否相交。我有一个View Controller类和一个CircleClass,CircleClass创建了一个具有手势识别功能的圆,因此我可以将自己创建的圆拖到想要的位置,现在我想添加一个选项,如果在拖移子视图的末尾与我的trashimageView相交(对于像垃圾箱一样的所有设备,图像视图始终位于视图的右下角),它可以删除圆圈或subView。

问题是,当我尝试在视图控制器中创建的函数“ deleteSubView”中调用trashImageView.frame时,显示为nil并且我的应用程序崩溃。

但是如果IBOutlet在VC中并且我的函数在VC中定义,我也可以在viewDidLoad中调用trashImageView.frame(CGRect值),这很好,但是在我的函数中没有,为什么我得到nil对于这个值??

class ViewController: UIViewController {

@IBOutlet var trashImageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    //here i can print the CGRect value just fine
    print("my imageView init: \(trashImageView.frame)")

}

func deleteSubView(subView: UIView){

    // Here i get nil from the trashImageView.frame

    if (subView.frame.intersects(trashImageView.frame)) {
        print("intersection")
        subView.removeFromSuperview()
    }
}
}

我检查了Nil值是否来自'trashImageView.frame',并且与情节提要的连接良好。

我从另一个类中将函数称为“删除subView”,但这应该重要吗?我不明白这里的错误是什么,为什么我得到零?请帮助。

ios swift storyboard iboutlet
1个回答
0
投票

因为您的UIViewController被声明,并且使用情节提要instantiated”,我的猜测是您正在使用没有arg初始化程序的视图控制器来创建视图,即:let controller = MyController()(如果必须以编程方式创建该控制器的实例)通过获取对包含控制器的情节提要的引用,即像这样:

NOTE:在这里,我使用“ MyController”作为类的名称以及在情节提要中设置的标识符。

func createMyController() -> MyController {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "MyController")

    return controller as! MyController
}

我还将在您的deleteSubview(:subView)方法中添加视图加载状态的保护措施,如下所示:

func deleteSubView(subView: UIView) {
    guard isViewLoaded else { return }

    // Here i get nil from the trashImageView.frame
    if (subView.frame.intersects(trashImageView.frame)) {
        print("intersection")
        subView.removeFromSuperview()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.