Ios 在Swift 5中将数据从UIPickerView传递到UIViewController
我目前正在尝试在Swift 5中构建一个简单的应用程序,它有一个主Ios 在Swift 5中将数据从UIPickerView传递到UIViewController,ios,swift,Ios,Swift,我目前正在尝试在Swift 5中构建一个简单的应用程序,它有一个主UIViewController: class TheList: UIViewController{ @IBOutlet var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSour
UIViewController
:
class TheList: UIViewController{
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
(...)
}
UIViewController
有一个使用UITableViewDataSource
和UITableViewDelegate
协议的扩展
extension TheList: UITableViewDelegate, UITableViewDataSource{
(...)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.row {
case 0:
let cell = tableView.dequeueReusableCell(withIdentifier: "titleViewCell")!
return cell
(...)
}
它使用特定的动态UITableViewCells
填充表格,这些单元格是它们自己的独立类。下面是一个例子:
class AmtTableViewCell: UITableViewCell{
@IBOutlet var hoursPickerView: UIPickerView!
override func awakeFromNib() {
super.awakeFromNib()
populate()
hoursPickerView.delegate = self
hoursPickerView.dataSource = self
}
(...)
}
extension AmtTableViewCell: UIPickerViewDelegate, UIPickerViewDataSource{
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return String(pickerData[row])
}
}
正如您所看到的,UITableViewCell
有一个UIPickerView
的出口。我想以某种方式将数据从这个类的UIPickerView
传递到我的UIViewController
,以便在那里进一步解析它。我试图创建一个方法来实现这一点,然后在我的视图控制器中调用它,但从我的理解来看,我必须首先实例化它,这就扼杀了这一点,因为我希望从用户在屏幕上看到的实例中获取值
我还尝试在我的视图控制器中为选择器创建一个出口,然后将其委托和数据源设置为AmtTableViewCell
类,而不是self
,但我知道我不能将UIPickerView
放在我的UIViewController
中
感谢您的帮助。使用闭包:
class AmtTableViewCell: UITableViewCell{
@IBOutlet var hoursPickerView: UIPickerView!
var selectedValueInPicker: ((String) -> Void)?
override func awakeFromNib() {
super.awakeFromNib()
populate()
hoursPickerView.delegate = self
hoursPickerView.dataSource = self
}
(...)
}
extension AmtTableViewCell: UIPickerViewDelegate, UIPickerViewDataSource{
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return String(pickerData[row])
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
selectedValueInPicker?(String(pickerData[row]))
}
}
extension TheList: UITableViewDelegate, UITableViewDataSource{
(...)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.row {
case 0:
let cell = tableView.dequeueReusableCell(withIdentifier: "titleViewCell") as? AmtTableViewCell
cell.selectedValueInPicker = { val in
//Do what is needed with the Stirng val that is comming from the cell passes in closure
}
return cell ?? AmtTableViewCell()
(...)
}
使用协议委托
protocol PickerSelectedValue{
func didSelectValueInPicker(value: String)
}
class AmtTableViewCell: UITableViewCell{
@IBOutlet var hoursPickerView: UIPickerView!
var delegate: PickerSelectedValue?
override func awakeFromNib() {
super.awakeFromNib()
populate()
hoursPickerView.delegate = self
hoursPickerView.dataSource = self
}
(...)
}
extension AmtTableViewCell: UIPickerViewDelegate, UIPickerViewDataSource{
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return String(pickerData[row])
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
delegate?.didSelectValueInPicker(String(pickerData[row]))
}
}
extension TheList: UITableViewDelegate, UITableViewDataSource,pickerSelectedValue{
(...)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.row {
case 0:
let cell = tableView.dequeueReusableCell(withIdentifier: "titleViewCell") as? AmtTableViewCell
cell?.delegate = self
return cell ?? AmtTableViewCell()
(...)
func didSelectValueInPicker(value: String){
print("the selected value in picker was",value)
}
}
委托协议的代码有点长,但可能更容易理解,但与闭包不兼容。您有两个选项闭包和委托。如何处理选择器选择未显示。您是否设置了自定义按钮,或者仅设置了picker委托方法DidSelectItem谢谢您的回答,我仍然无法使用任何一种方法。代码在语义上是正确的,并且确实可以编译,但是数据似乎没有被传递,或者我做了一些错误的事情。使用委托方法,在列表类中我创建了一个变量“a”,然后在didSelectValueInPicker函数中我放置了“a=value”,并创建了一个按钮操作,它应该打印“a”,我希望它这样做,但它不会。如果没有look you代码,它就会出错,更新它以显示您的更改,以帮助您找出错误配置的按钮是我的错!我可以确认委托方法现在运行良好,谢谢您的帮助。