具有自定义属性的手势识别器和UIImageView

时间:2018-12-09 02:15:45

标签: swift

我的应用使用的图像可能具有各种状态,因此我将自定义属性用作标签。可以,但是我的点击手势识别器似乎无法访问这些属性。点击图像时,我需要采取措施以取决于这些属性的状态。手势识别器是否可以从被窃听的子类UIImageView中读取这些自定义属性,还是应该采用其他方法?谢谢!

public class advancedTagUIImageView: UIImageView {
    var photoViewedStatus: Bool?
    var photoLikedStatus: Bool?
}

viewDidLoad() {
    let imageView = advancedTagUIImageView(frame:CGRect(origin: CGPoint(x:50, y:50), size: CGSize(width:100,height:100)))
    imageView.image = UIImage(named: dog.png)
    imageView.photoViewedStatus = false
    imageView.photoLikeStatus = false
    imageView.tag = 7
    imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(soundTapped)))
    view.addSubview(imageView)
}

 @objc func soundTapped(gesture: UIGestureRecognizer) {
    let photoTag = gesture.view!.tag // this works great
    let isPhotoLiked = gesture.view!.photoLikeStatus // this doesn't work
    // do whatever 
}

1 个答案:

答案 0 :(得分:0)

快速键入。 User.findOne()属性的类型为gesture.view,没有在您的UIView类中定义的属性。这是因为理论上您也可以将advancedTagUIImageView附加到任何其他类型的视图。在这种情况下,该程序将在您的UITapGestureRecognizer方法上崩溃,因为您只是假设soundTappedgesture.view,而情况并非总是如此。

要让编译器访问这些属性,首先需要检查advancedTagUIImageView是否真的是您的子类,如下所示:

gesture.view

PS:根据Swift API Design Guidelines类型,名称应大写,因此在您的情况下,名称应为if let photoView = (gesture.view? as? advancedTagUIImageView) { // you can access your tags here let isPhotoLiked = photoView.photoLikeStatus } else { // you might want to handle the case that the gesture was invoked from another view. If you're certain this should not happen, maybe just throw an assertion error to get notified in case it still does. } 。不遵循这些准则可能不会使您的程序崩溃,但是如果您需要与其他人一起编写代码,这样做可能会使您的生活变得更加轻松。