在 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")
}
所有单元格都正确填充,但点击它们没有任何反应。
我想要的功能与在 safari 中看到的 here 完全一样。
是否有其他方法可以做到这一点,或者我对按钮做错了什么?另外是的,我可以只使用开关,但我们的 Android 版本的应用程序使用检查列表,就像 safari 一样,我们希望保持一致。
你应该实施
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
}
}
在我的应用程序中,我有一个设置页面,我想要一个用作复选框的 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")
}
所有单元格都正确填充,但点击它们没有任何反应。 我想要的功能与在 safari 中看到的 here 完全一样。
是否有其他方法可以做到这一点,或者我对按钮做错了什么?另外是的,我可以只使用开关,但我们的 Android 版本的应用程序使用检查列表,就像 safari 一样,我们希望保持一致。
你应该实施
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
}
}