繁体   English   中英

在UIPickerView的单元格中使用UIButton

[英]Using UIButton within the cell of UIPickerView

在我的应用程序中,我有一个设置页面,我想要一个UIPickerView作为一个复选框(列出项目,您可以启用或禁用它们)。 我查找了不同的解决方案,而我所能找到的只是使用viewForRow和UIButton。 我能够添加按钮,看起来不错,但按钮似乎无法轻按。

这是我的实现:

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView{
    let button = UIButton(type: .system)
    button.addTarget(self, action: #selector(screenSelectorButtonPress(_:)), for: .touchUpInside)
    button.tag = 0
    if row == 0{
        button.setTitle(Array3[row], for: .normal)
    }else{
        button.setTitle("\u{2610} \(Array3[row])", for: .normal)
    }
    return button
}

@objc func screenSelectorButtonPress(_ sender:UIButton!){
    print("test")
}

所有的单元格都能正确填充,但是点击它们不会执行任何操作。 我需要的功能是完全一样看到这里的野生动物园。

还有另一种方法可以执行此操作吗,或者我在按钮上做错了什么? 另外,是的,我只能使用开关,但是我们的Android版本的应用使用的清单类似于野生动物园的工作方式,因此我们希望保持一致。

你应该实现

func pickerView(_ pickerView: UIPickerView, 
        didSelectRow row: Int, 
         inComponent component: Int)

//

self.pickerView.delegate = self

//

class ViewController: UIViewController , UIPickerViewDelegate,UIPickerViewDataSource , UIGestureRecognizerDelegate {

    let pickerView = UIPickerView()

    override func viewDidLoad() {

        super.viewDidLoad()

        pickerView.frame = CGRect(x: 0, y: 30, width: self.view.frame.width, height: 300)

        pickerView.delegate = self

        pickerView.dataSource = self

        view.addSubview(pickerView)

        let tap = UITapGestureRecognizer(target: self, action: #selector(pickerTapped))

        tap.delegate = self

        pickerView.addGestureRecognizer(tap)

    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return Array3.count
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print(row)
    }


    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        if row == 0 {

            return Array3[row]
        }
        else {

            return "\u{2610} \(Array3[row])"
        }

    }


    @objc func pickerTapped(tapRecognizer: UITapGestureRecognizer) {
        if tapRecognizer.state == .ended {
            let rowHeight = self.pickerView.rowSize(forComponent: 0).height
            let selectedRowFrame = self.pickerView.bounds.insetBy(dx: 0, dy: (self.pickerView.frame.height - rowHeight) / 2)
            let userTappedOnSelectedRow = selectedRowFrame.contains(tapRecognizer.location(in: self.pickerView))
            if userTappedOnSelectedRow {
                let selectedRow = self.pickerView.selectedRow(inComponent: 0)
                pickerView(self.pickerView, didSelectRow: selectedRow, inComponent: 0)
            }
        }
    }


    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM