[英]Update UIButton title with array data using UIPickerView selected row
This question has been covered before but I'm just not getting it. 之前已经解决了这个问题,但我没有明白。
I have three buttons to show a UIPickerView. 我有三个按钮来显示UIPickerView。
button1.addTarget(self, action: #selector(showPicker), for: .touchUpInside)
button2.addTarget(self, action: #selector(showPicker), for: .touchUpInside)
button3.addTarget(self, action: #selector(showPicker), for: .touchUpInside)
Depending on the button clicked, the picker data (modelData) and tag are updated. 根据单击的按钮,选择器数据(modelData)和标签会更新。
@objc func showFilterPicker(sender: UIButton)
if sender.tag == 238 {
modelData = someStringArray1
filterPickerView.reloadAllComponents()
filterPickerView.tag = 2238
} else if sender.tag == 239 {
modelData = someStringArray2
filterPickerView.reloadAllComponents()
filterPickerView.tag = 2239
} else if sender.tag == 240 {
modelData = someStringArray3
filterPickerView.reloadAllComponents()
filterPickerView.tag = 2240
}
}
To update the button title 更新按钮标题
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if filterPickerView.tag == 2238 {
button1.setTitle(modelData[row], for: .normal)
} else if filterPickerView.tag == 2239 {
button2.setTitle(modelData[row], for: .normal)
} else if filterPickerView.tag == 2240 {
button3.setTitle(modelData[row], for: .normal)
}
}
However, this does not work. 但是,这不起作用。
Any suggestions or a more detailed example of the linked answers would be helpful, thanks. 任何建议或链接答案的更详细示例都将有所帮助,谢谢。
-- -
view hierarchy 视图层次
override func viewDidLoad() {
view.addSubview(outerView)
outerView.addSubview(scrollView)
scrollView.addSubview(containerView)
containerView.addSubview(button1)
containerView.addSubview(button2)
containerView.addSubview(button3)
view.addSubview(pickerContainerView)
pickerContainerView.addSubview(filterPickerView)
}
Here is a complete, functional example. 这是一个完整的功能示例。 No IBOutlets or IBActions, so just assign a new view controller to this class: 没有IBOutlets或IBAction,因此只需将新的视图控制器分配给此类:
//
// DeanViewController.swift
// TestProj
//
// Created by Don Mag on 8/20/19.
//
import UIKit
class DeanViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
let button1: UIButton = {
let b = UIButton()
b.translatesAutoresizingMaskIntoConstraints = false
b.backgroundColor = .red
b.setTitle("Button 1", for: .normal)
return b
}()
let button2: UIButton = {
let b = UIButton()
b.translatesAutoresizingMaskIntoConstraints = false
b.backgroundColor = .red
b.setTitle("Button 2", for: .normal)
return b
}()
let button3: UIButton = {
let b = UIButton()
b.translatesAutoresizingMaskIntoConstraints = false
b.backgroundColor = .red
b.setTitle("Button 3", for: .normal)
return b
}()
let filterPickerView: UIPickerView = {
let v = UIPickerView()
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
let buttonStackView: UIStackView = {
let v = UIStackView()
v.translatesAutoresizingMaskIntoConstraints = false
v.axis = .vertical
v.spacing = 8
return v
}()
let containerView: UIView = {
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .cyan
return v
}()
let pickerContainerView: UIView = {
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .green
return v
}()
let scrollView: UIScrollView = {
let v = UIScrollView()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .blue
return v
}()
let data1 = ["One", "Two", "Three"]
let data2 = ["This", "is", "a", "Test"]
let data3 = ["A", "B", "C", "D", "E"]
var modelData: [String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// add the 3 buttons to the stack view
buttonStackView.addArrangedSubview(button1)
buttonStackView.addArrangedSubview(button2)
buttonStackView.addArrangedSubview(button3)
// add the stack view to the container view
containerView.addSubview(buttonStackView)
// add the container view to the scroll view
scrollView.addSubview(containerView)
// add the picker view to its container view
pickerContainerView.addSubview(filterPickerView)
// add the picker container view to the scroll view
scrollView.addSubview(pickerContainerView)
// add the scroll view to the view
view.addSubview(scrollView)
// setup the constraints
NSLayoutConstraint.activate([
buttonStackView.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 20.0),
buttonStackView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: -20.0),
buttonStackView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 20.0),
buttonStackView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -20.0),
filterPickerView.topAnchor.constraint(equalTo: pickerContainerView.topAnchor, constant: 20.0),
filterPickerView.bottomAnchor.constraint(equalTo: pickerContainerView.bottomAnchor, constant: -20.0),
filterPickerView.leadingAnchor.constraint(equalTo: pickerContainerView.leadingAnchor, constant: 20.0),
filterPickerView.trailingAnchor.constraint(equalTo: pickerContainerView.trailingAnchor, constant: -20.0),
containerView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 20.0),
containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 20.0),
containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0.0),
pickerContainerView.topAnchor.constraint(equalTo: containerView.bottomAnchor, constant: 20.0),
pickerContainerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 20.0),
pickerContainerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0.0),
pickerContainerView.bottomAnchor.constraint(greaterThanOrEqualTo: scrollView.bottomAnchor, constant: 20.0),
pickerContainerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, constant: -40.0),
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
])
modelData = data1
filterPickerView.tag = 1
filterPickerView.dataSource = self
filterPickerView.delegate = self
button1.addTarget(self, action: #selector(btnTap(_:)), for: .touchUpInside)
button2.addTarget(self, action: #selector(btnTap(_:)), for: .touchUpInside)
button3.addTarget(self, action: #selector(btnTap(_:)), for: .touchUpInside)
}
@objc func btnTap(_ sender: UIButton) -> Void {
if sender == button1 {
modelData = data1
filterPickerView.tag = 1
} else if sender == button2 {
modelData = data2
filterPickerView.tag = 2
} else {
modelData = data3
filterPickerView.tag = 3
}
filterPickerView.reloadAllComponents()
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
var btn: UIButton?
if pickerView.tag == 1 {
btn = button1
} else if pickerView.tag == 2 {
btn = button2
} else {
btn = button3
}
btn?.setTitle(modelData[row], for: .normal)
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return modelData[row]
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return modelData.count
}
}
Result: 结果:
Blue is the background color of the scroll view; 蓝色是滚动视图的背景色; Green is the background color of the picker container view Cyan is the background color of the buttons container view (the buttons are also embedded in a stack view) 绿色是选取器容器视图的背景色青色是按钮容器视图的背景色(按钮也嵌入在堆栈视图中)
Tapping each button changes the data in the picker, and selecting a row in the picker changes the title of the associated button. 轻触每个按钮会更改选择器中的数据,而在选择器中选择一行会更改关联按钮的标题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.