【问题标题】:How to know which pic in which tableview cell has been touched?如何知道哪个表格视图单元格中的哪个图片被触摸了?
【发布时间】:2017-02-14 00:14:08
【问题描述】:

我的 tableView 中有自定义 tableViewCells。它们在单元格内有 2 个或多个 ImageView,可以触摸它们,然后它们会反弹并被选中。但是由于单元格被重复使用,我怎么知道哪一行中的哪个 ImageView 被选中了呢?我知道我可以得到 indexPath.row,但我怎么知道 2 或 3 个图像中的哪一个触发了给我 indexPath 的函数?希望你们明白我的意思。这是我的自定义 tableViewCell,tableView 代码只是有点标准。

import UIKit

class TwoPicsTableViewCell: UITableViewCell {

@IBOutlet var containerView: UIView!
@IBOutlet var votesButton: UIButton!
@IBOutlet var commentsButton: UIButton!
@IBOutlet var firstImage: bouncingRoundImageView!
@IBOutlet var secondImage: bouncingRoundImageView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var descriptionLabel: UILabel!
@IBOutlet var topUsernameLabel: UILabel!
@IBOutlet var bottomUsernameLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    //self.layoutIfNeeded()
    containerView.layer.cornerRadius = 10
    containerView.clipsToBounds = true
    self.backgroundColor = ColorScheme.primaryColor
    votesButton.setTitleColor(ColorScheme.fourthColor, for: UIControlState())
    commentsButton.setTitleColor(ColorScheme.fourthColor, for: UIControlState())

    setupBackgroundGradient()
    setupFirstImage()
    setupSecondImage()
}

func setupBackgroundGradient() {

    let bottomColor = ColorScheme.secondaryColor.cgColor
    let topColor = ColorScheme.thirdColor.cgColor

    let layer = CAGradientLayer()
    layer.frame = containerView.frame
    layer.frame.offsetBy(dx: -10,dy:-10)
    layer.frame.size.width += 10
    layer.frame.size.height += 10
    layer.colors = [topColor, bottomColor]

    containerView.layer.insertSublayer(layer, at: 0)

}

func setupFirstImage() {

    let tappedOne = UITapGestureRecognizer(target: self, action: #selector(checkPicTwo))
    firstImage.addGestureRecognizer(tappedOne)
}

func setupSecondImage() {

    let tappedTwo = UITapGestureRecognizer(target: self, action: #selector(checkPicOne))
    secondImage.addGestureRecognizer(tappedTwo)
}

func checkPicTwo() {

    firstImage.bouncing()
    vote(voteForPic: firstImage)

    if secondImage.layer.borderWidth != 0 {
        secondImage.layer.borderWidth = 0
    }
}

func checkPicOne() {

    secondImage.bouncing()

    if firstImage.layer.borderWidth != 0 {
        firstImage.layer.borderWidth = 0
    }
}

override func prepareForReuse() {
    super.prepareForReuse()
    firstImage.image = nil
    secondImage.image = nil
    firstImage.layer.borderWidth = 0
    secondImage.layer.borderWidth = 0
}

}

【问题讨论】:

  • 你已经在每个图像视图上都有点击手势,所以现在你知道哪个图像被触摸了。有什么问题?
  • true,但点击手势在 tableViewCell 类中。那么如何从那里获取 indexPath 呢?我只知道我可以从 UITableView 类中的 UITableView 获取 indexPath,但是我需要在图像上放置另一个手势识别器,这似乎是错误的?!
  • 你需要一个委托来在视图控制器中触发一个单元格被触摸的事件。 ViewController 引用了表格视图,可以通过调用 tableview.indexPathForCell 函数为您提供 indexPath
  • 你能告诉我怎么做吗?我真的不明白你的意思。
  • 这个答案可能对stackoverflow.com/questions/28659845/…有帮助

标签: ios swift uitableview uitapgesturerecognizer


【解决方案1】:
protocol TwoPicsTableViewCellDelegate{
    func image1Clicked(cell:TwoPicsTableViewCell)
    func image2Clicked(cell:TwoPicsTableViewCell)
}

class TwoPicsTableViewCell: UITableViewCell {

    var delegate:TwoPicsTableViewCellDelegate!

    func checkPicTwo() {

        firstImage.bouncing()
        vote(voteForPic: firstImage)

        if secondImage.layer.borderWidth != 0 {
            secondImage.layer.borderWidth = 0
        }

        //delegate call
        delegate.image1Clicked(self)
    }

    func checkPicOne() {

        secondImage.bouncing()

        if firstImage.layer.borderWidth != 0 {
            firstImage.layer.borderWidth = 0
        }

        //delegate call
        delegate.image2Clicked(self)
    }
}

在视图控制器中符合它:

class myViewController: UIViewController, TwoPicsTableViewCellDelegate{


    //implement delegate methods

    func image1Clicked(cell:TwoPicsTableViewCell){
        let indexPath = tableview.indexPathForCell(cell)
        print(indexPath)
    }

    func image2Clicked(cell:TwoPicsTableViewCell){
        let indexPath = tableview.indexPathForCell(cell)
        print(indexPath)
    }


    func table cellForRowAt..........{
        let cell = table.dequeCellAt..........   as? TwoPicsTableViewCell
        //Assign delegate
        cell.delegate = self
        .......
        .......

        return cell

    }

}

【讨论】:

  • 非常感谢!我会尽快尝试的!
  • 已经在表格单元类中定义了它,正如我在上面的答案中提到的那样? var delegate:TwoPicsTableViewCellDelegate!
  • 那是我的错误 :D 构建应用程序有效,但是当我点击图像时出现错误:在展开可选值时意外发现 nil :(
  • 对不起,我的错误又来了 :D 我把 cell.delegate = self 放入了错误的单元格.. 完美的工作!!!非常感谢!
  • 我修复了它。问题是,首先,我只有一个默认的 twoPicsTableViewCell 类型的单元格,它只是说“正在加载”并且图像视图被隐藏了......然后我从firebase 并用数据重新加载 tableView 并再次显示 imageViews ......我仍然不知道为什么这会影响一些随机单元格,但是当我在加载单元格之前没有放置默认单元格时(所以我只是离开 tableView清空然后加载单元格),然后它就可以工作了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多