在Swift

时间:2015-09-18 15:35:02

标签: ios swift

你可能会问自己“有条件地点击”是什么意思:

我有一个UITableView,其中包含一些生成的单元格。单元格上有一些图像和标签。无论我在哪里点击单元格区域(在单元格本身上,或在图像或标签上),它都会将我带到CellDetailViewController - ref. image

现在,在导航栏中我想要一个“过滤器”按钮,当点击(或者更确切地说触发 - 点击打开,点击关闭)时,会在这些单元格上创建UI元素在点击时执行特定于元素的操作,而不是像通常那样切换到ViewController。我打算采取一个动作来获取元素并过滤表格,根据所显示的元素显示包含特定数据的单元格 - 这意味着我需要确切知道在哪个单元格中挖掘了哪个元素(最佳情况)它是作为参数的传递者传递的,所以我可以访问它的属性。)

我最初的想法是,我可以让UI元素始终调用动作,这将检查过滤器按钮是否被点击,然后切换到ViewController(如果不是),或执行过滤器操作(如果它是)。这种方法的问题在于它看起来真的很笨拙和缓慢,如果有更好的解决方案,我真的不想重新发明轮子。

所以,问题是 - 还有另一种方法可以实现这一目标吗?根据需要点击UI元素吗?

E:添加了有关该问题的更多信息。

2 个答案:

答案 0 :(得分:1)

我建议您使用UIGestureRecognizer来实现您的目标,因为UIImageViewUILabel默认情况下不响应用户的触摸事件。

以下是您可能想要查看的一些代码(这是一个工作示例)

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
{

}