简体   繁体   English

表视图单元格中带有 UIImageView 的 UITapGestureRecognizer 不工作 Swift

[英]UITapGestureRecognizer with UIImageView in Table View Cell not working Swift

In my Table View Controller I'm requesting data from my backend.在我的表视图控制器中,我从后端请求数据。 Then adding the data to an array with a view model for each row from the request.然后将数据添加到具有请求中每一行的视图模型的数组中。

let getNotifications = GETNotificationsByUserID(user_id: user_id)
getNotifications.getNotifications { notifications in
    self.notifications = notifications.map { notification in
    let ret = NotificationViewModel()
    ret.mainNotification = notification
    return ret
}
class NotificationViewModel {
    var mainNotification: Notifications? {}
}

struct Notifications: Codable {
    var supporter_picture:String?
}

In the same table view controller, I'm then adding each item from the array to a variable in my table view cell.在同一个表视图控制器中,我将数组中的每个项目添加到表视图单元格中的变量中。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath) as! NotificationCell
    cell.user_image.isUserInteractionEnabled = true
    let item = self.notifications[indexPath.item]
    cell.viewModel = item
    return cell
}

Downloading the image from the data from my table view cell variable and setting my UIImageView image.从我的表格视图单元格变量的数据中下载图像并设置我的 UIImageView 图像。

UITableViewCell UITableViewCell

class NotificationCell: UITableViewCell {
    var viewModel: NotificationViewModel? {
        didSet {
            if let item = viewModel {
                self.username.text = item.mainNotification?.supporter_username
                item.supporterImageDownloader = DownloadImage()
                item.supporterImageDownloader?.imageDidSet = { [weak self] image in
                    self?.user_image.image = image
                }
                if let picture = item.mainNotification?.supporter_picture {
                    item.supporterImageDownloader?.downloadImage(urlString: picture)
                } else {
                    self.user_image.image = UIImage(named: "profile-placeholder-user")
                }
            }
        }
    }
}

The UIImageView is created from a lazy closure variable. UIImageView 是从惰性闭包变量创建的。 The lazy closure variable also holds a UITapGestureRecognizer.惰性闭包变量还包含一个 UITapGestureRecognizer。

UITableViewCell UITableViewCell

lazy var user_image: UIImageView = {
    let image = UIImageView()
    let gesture = UITapGestureRecognizer()
    gesture.addTarget(self, action: #selector(userImageClicked(_:)))
    gesture.numberOfTapsRequired = 1
    gesture.numberOfTouchesRequired = 1
    image.addGestureRecognizer(gesture)
    image.isUserInteractionEnabled = true
    return image
}()
   
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.isUserInteractionEnabled = true
    addSubview(user_image)
    user_imageContraints()
}
    
func user_imageContraints() {
    user_image.translatesAutoresizingMaskIntoConstraints = false
    user_image.topAnchor.constraint(equalTo:topAnchor, constant: 8).isActive = true
    user_image.leadingAnchor.constraint(equalTo:leadingAnchor, constant: 8).isActive = true
    user_image.heightAnchor.constraint(equalToConstant: 40).isActive = true
    user_image.widthAnchor.constraint(equalToConstant: 40).isActive = true
}

@objc func userImageClicked(_ sender: UITapGestureRecognizer) {
    print("image clicked")
}

For some reason when my UIImageView is clicked it doesn't do anything.出于某种原因,当我的 UIImageView 被点击时,它什么也不做。

The problem is this line:问题是这一行:

addSubview(user_image)

Change it to:将其更改为:

contentView.addSubview(user_image)

You must never add any views directly to a cell — only to its contentView .您绝不能将任何视图直接添加到单元格 - 只能添加到它的contentView

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM