Swift 3在单元格按钮上添加选择器问题

时间:2017-08-01 08:24:33

标签: ios swift xcode swift3 selector

我的集合视图单元格中有一个自定义按钮。我只想将indexPath传递给它,但我得到了 "无法识别的选择器错误"

这是我的代码

cell.showMapButton.addTarget(self, action: #selector(testFunc(indexPath:)), for: .touchUpInside)

,功能是

func testFunc(indexPath: IndexPath){
    print("Testing indexPath \(indexPath)")
}

如果我删除indexPath参数它工作正常并且函数被调用但我需要该参数所以请帮助我解决这个问题。

2 个答案:

答案 0 :(得分:1)

您可以使用目标选择器参数传递UIButton实例以执行按钮操作。

尝试使用以下代码:

添加/替换下面的代码,属于集合视图单元格到您的集合视图数据源方法 - cellForRowAtIndexPath

cell.showMapButton.tag = indexPath.row
cell.showMapButton.addTarget(self, action: #selector(testFunc(button:)), for: .touchUpInside)

对于Swift 4 - 使用@objc定义您的选择器功能,如下所示。

@objc func testFunc(button: UIBUtton){
    print("Index = \(button.tag)")    
}

答案 1 :(得分:1)

在UIButton的addTarget(:action:for :)方法中,该操作最多可以接受单个UIButton或其任何超类作为参数。如果需要按钮的indexPath,则需要通过子类或其他方法使其成为UIButton的属性。我这样做的方法是创建一个UIButton的子类,它具有indexPath作为它的属性:

FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
EXPOSE 80
ENV NAME World
CMD ["python", "app.py"]

然后正常添加目标:

class ButtonWithIndexPath: UIButton {
    var indexPath:IndexPath?
}

不要忘记将按钮的indexPath设置为

中的单元格
cell.showMapButton.addTarget(self, action: #selector(testFunc(button:)), for: .touchUpInside)

并将其转换为函数中的自定义子类以读取indexPath:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath) as! myCell
    cell.button.indexPath = indexPath
    ...
    return cell
}