UITapGestureRecognizer操作不起作用

时间:2018-07-28 15:56:31

标签: ios swift uitapgesturerecognizer

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

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

和我的功能在这里:

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

问题是我点击我的卡却什么也没发生。我认为问题是我在不是同一类的init的UIView中安装了一个手势...

所以我的问题是:

  

当我在另一个类中调用的UIView中添加gesture时,可能会遇到麻烦吗?


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

TableView代码:

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")
}
}

2 个答案:

答案 0 :(得分:0)

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

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

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

希望这行得通。

答案 1 :(得分:0)

您想要的可能类似于助手结构:

=index('District Data'!b:b, match(d2, 'District Data'!c:c, 0))

现在,您的SelectMoment结构实例可以与CardCell实例保持联系,并且CardCell可以看到它;拥有正确的属性,他们甚至可以毫无问题地来回交流。

请注意,该体系结构只是草图,向您展示了如何将两种类型的功能区分开。我不知道您打算使用的用例。也许您想要的是能够为每个不同的单元格类型分配不同配置的SelectMoment。在这种情况下,请不要在struct SelectMoment { // ... } class CardCell : UITableViewCell { var selectMoment : SelectMoment! override func viewDidLoad() { super.viewDidLoad() self.selectMoment = SelectMoment(...) // ... } // ... } 中设置selectMoment;允许其他一些类对其进行设置(可能通过初始化程序,也可能只是直接对其进行设置),并做出相应的响应。这种架构称为依赖注入