UITapGestureRecognizer 操作不起作用

UITapGestureRecognizer action don't work

我的 UITapGestureRecognizer 有问题。我使用此代码:

let gesture = UITapGestureRecognizer(target: self, action: #selector(self.SelectPictureAction(_:)))
    cardView.addGestureRecognizer(gesture)

我的功能在这里:

@objc func SelectPictureAction(_ sender : UITapGestureRecognizer) {
    print("card moment is Tapped")
}

问题是我刷了我的卡,但没有任何反应。我认为问题是我在 UIView 中安装了一个手势,它不是在同一个 class...

中初始化的

所以我的问题是:

This is possible there are a trouble when I add a gesture in a UIView called in another class ?


这是我的 3 class 我使用的代码:

表格视图代码:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {


@IBOutlet var tableView: UITableView!


override func viewDidLoad() {
    super.viewDidLoad()
    tableView.register(CardCell.self, forCellReuseIdentifier: "Cell")
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 2
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier:"Cell") as! CardCell
    cell.widthOfDevice = tableView.bounds.size.width
    if indexPath.row == 1 {
        cell.doTheWork(statutOfCard: .selectMoment)
    }else{
        cell.doTheWork(statutOfCard: .goMoment(picture:#imageLiteral(resourceName: "img2")))
    }

    return cell
}
}

CardCell 代码:

class CardCell : UITableViewCell {
let cardView = UIView()
enum statut {
    case selectMoment
    case goMoment(picture: UIImage)
}

func doTheWork(statutOfCard : statut){
    switch statutOfCard {
    case .selectMoment:
        self.drawMomentPicture()
    case .goMoment(let picture):
        self.drawGoMoment(image: picture)
    default:
        cardViewHeightCon.constant = 300
        self.addCardShadow()
    }
}

func drawMomentPicture(){
    if(cardIsDraw == false){
        widthOfCard = widthOfDevice - (widthMarginConstraint*2)
        cardViewHeightCon.constant = widthOfCard!*ratioOfImage
        _ = SelectMoment(countUserMoment: 1, cardView: self.cardView, tableViewCell: self) // Here I call my class
        self.addCardShadow()
        cardIsDraw = true
    }
}
}

SelectMoment 代码:

class SelectMoment {
    let countUserMoment: Int
    let cardView : UIView
    let selfTableViewCell : UITableViewCell

init(countUserMoment: Int, cardView : UIView, tableViewCell : UITableViewCell) {
    self.countUserMoment = countUserMoment
    self.cardView = cardView
    self.selfTableViewCell = tableViewCell
    self.drawCard()
}
func drawCard(){
    cardView.backgroundColor = .yellow
    cardView.isUserInteractionEnabled = true
    let gesture = UITapGestureRecognizer(target: self, action: #selector(self.SelectMomentAction(_:)))
    cardView.addGestureRecognizer(gesture)
}
@objc func SelectMomentAction(_ sender : UITapGestureRecognizer) {
    print("card moment is Tapped")
}
}

你的选择器参数似乎是错误的,请像下面那样使用。

let gesture = UITapGestureRecognizer(target: self, action: #selector(self.SelectMomentAction(_:)))

@objc func SelectMomentAction(_ sender : UITapGestureRecognizer) {
    print("card moment is Tapped")
}

希望这有效。

你想要的可能是辅助结构:

struct SelectMoment {
    // ...
}
class CardCell : UITableViewCell {
    var selectMoment : SelectMoment!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.selectMoment = SelectMoment(...)
        // ...
    }
    // ...
}

现在您的 SelectMoment 结构实例有一个与您的 CardCell 实例连接的地方,并且 CardCell 可以看到它;有了正确的属性,他们甚至可以毫无问题地来回交谈。

请注意,该体系结构只是向您展示如何区分这两种类型的权力的草图。我不知道您的预期用例。也许您想要的是能够为每种不同的细胞类型分配不同配置的 SelectMoment。在那种情况下,不要在viewDidLoad中设置selectMoment;允许其他 class 设置它(可能通过初始化程序或可能只是直接设置),并相应地做出响应。该架构称为 依赖注入