你可能会问自己“有条件地点击”是什么意思:
我有一个UITableView,其中包含一些生成的单元格。单元格上有一些图像和标签。无论我在哪里点击单元格区域(在单元格本身上,或在图像或标签上),它都会将我带到CellDetailViewController - ref. image。
现在,在导航栏中我想要一个“过滤器”按钮,当点击(或者更确切地说触发 - 点击打开,点击关闭)时,会在这些单元格上创建UI元素在点击时执行特定于元素的操作,而不是像通常那样切换到ViewController。我打算采取一个动作来获取元素并过滤表格,根据所显示的元素显示包含特定数据的单元格 - 这意味着我需要确切知道在哪个单元格中挖掘了哪个元素(最佳情况)它是作为参数的传递者传递的,所以我可以访问它的属性。)
我最初的想法是,我可以让UI元素始终调用动作,这将检查过滤器按钮是否被点击,然后切换到ViewController(如果不是),或执行过滤器操作(如果它是)。这种方法的问题在于它看起来真的很笨拙和缓慢,如果有更好的解决方案,我真的不想重新发明轮子。
所以,问题是 - 还有另一种方法可以实现这一目标吗?根据需要点击UI元素吗?
E:添加了有关该问题的更多信息。
答案 0 :(得分:1)
我建议您使用UIGestureRecognizer
来实现您的目标,因为UIImageView
和UILabel
默认情况下不响应用户的触摸事件。
以下是您可能想要查看的一些代码(这是一个工作示例)
protocol TableViewCellDelegate: class {
func labelTouchedInCell(cell: TableViewCell)
func imagedTouchedInCell(cell: TableViewCell)
}
class TableViewCell: UITableViewCell {
// You can drag & drop a label and an imageView to the prototype cell and create these IBOutlets
@IBOutlet weak var label: UILabel! {
didSet {
label.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "_labelTouched"))
label.userInteractionEnabled = true
}
}
@IBOutlet weak var cardImage: UIImageView! {
didSet {
cardImage.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "_imageTouched"))
cardImage.userInteractionEnabled = true
}
}
var delegate: TableViewCellDelegate?
func _labelTouched() {
delegate?.labelTouchedInCell(self)
}
func _imageTouched() {
delegate?.imagedTouchedInCell(self)
}
}
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = 80
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
cell.delegate = self
return cell
}
}
extension TableViewController: TableViewCellDelegate {
func labelTouchedInCell(cell: TableViewCell) {
let indexPath = tableView.indexPathForCell(cell)!
print("Touched label in cell at row \(indexPath.row)")
}
func imagedTouchedInCell(cell: TableViewCell) {
let indexPath = tableView.indexPathForCell(cell)!
print("Touched image in cell at row \(indexPath.row)")
}
}
如果您只想在满足某些条件时处理点击,请在委托方法
中进行检查答案 1 :(得分:0)
有一种棘手的方法可以做到这一点。我记得为我的一个项目要求做了类似的事情。试试下面的代码。我只是快速写了它,没有测试所以请耐心等待我。
// Set the tag of the imageview/label to be equal to the row number
cell.imageView.tag = indexPath.row;
cell.label.tag = indexPath.row;
// Sets up taprecognizer for each imageview
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapOnImageView:)];
[cell.imageView addGestureRecognizer:tap];
// Sets up taprecognizer for each label
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapOnLabel:)];
[cell.label addGestureRecognizer:tap];
// Enable the image/label to be clicked
cell.imageView.userInteractionEnabled = YES;
cell.label.userInteractionEnabled = YES;
- (void)handleTapOnImageView:(UITapGestureRecognizer *)recognizer
{
// Do your handling
//recognizer.view.tag
}
- (void)handleTapOnLabel:(UITapGestureRecognizer *)recognizer
{
}