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



我正在使用 swift 工作,我正在尝试使用 .frame 来检查 CGRect 类型的 2 个对象是否相交。 我有我的视图控制器类和一个 CircleClass,CircleClass 创建一个具有手势识别功能的圆圈,这样我就可以将我创建的圆圈拖动到我想要的地方,现在我想添加一个选项,如果在拖动结束时子视图与我的垃圾图像视图相交(图像视图将始终位于所有设备的视图的右下角,就像垃圾桶(它可以删除圆或子视图。

问题是,当我尝试在视图控制器中创建的函数"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",并且与故事板的连接是否良好。

我从另一个类中调用函数"删除子视图",但这应该重要吗? 我不明白这里的错误是什么,为什么我得到零? 请帮忙。

由于您的UIViewController是使用故事板声明和实例化的,我的猜测是您正在使用它没有 arg 初始值设定项来创建视图控制器,即:let controller = MyController(),如果您必须以编程方式创建控制器的实例,请通过获取对包含控制器的故事板的引用来实现,即:

注意:在这里,我使用"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()
}
}

最新更新