如何在以编程方式创建的 UIPicker Delegate 中返回选定的值

Posted

技术标签:

【中文标题】如何在以编程方式创建的 UIPicker Delegate 中返回选定的值【英文标题】:How to return selected value in UIPickerDelegate when created programatically 【发布时间】:2016-09-08 12:33:39 【问题描述】:

我有一个viewController,上面有一堆输入。其中一些是普通文本,但有些需要选择器的输入。我决定将每个PickerDelegatePickerDataSource 的实现移动到一个单独的文件中,以使事情变得更简洁。数据正在出现,但在选择 Picker 时,我不知道如何让事件在我的 viewController 中触发。目前它只在 PickerDelete 类中触发。

一些基本的布局信息是

class MyClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource 

let jobTypePickerValues = ["value1", "value2"]

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int 
    return 1


// returns the # of rows in each component..
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
    return jobTypePickerValues.count


func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
    return jobTypePickerValues[row]


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

    //println("I want this in the view controller that set up the picker")

在显示选择器的视图控制器中,我有以下内容

    override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    myClassSource = MyClass()
    pickerView = UIPickerView()
    pickerView.dataSource = myClassSource
    pickerView.delegate = myClassSource

    // set the input view of the job type to be a picker view
    textInput.inputView = pickerView
    textInput.text = jobTypePickerValues[0]

【问题讨论】:

你可以让你的 MyClass 自定义委托,可以在你的视图控制器类中调用。这将解决问题 【参考方案1】:

您需要创建一个自定义委托并在您创建pickerView 的ViewController 中实现。

protocol CustomPickerDelegate 
     func selectedItem(item: String)
 

现在在MyClass 中创建此协议的实例并在`ViewController` 中实现

class MyClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource 

    let jobTypePickerValues = ["value1", "value2"]
    var delegate: CustomPickerDelegate?
    .. Other code and methods

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
         delegate?. selectedItem(jobTypePickerValues[row])
    

现在在viewDidLoad中设置delegate,实现protocol的方法。

class ViewController: UIViewController, CustomPickerDelegate 

     override func viewDidLoad() 
         super.viewDidLoad()

         myClassSource = MyClass()
         myClassSource.delegate = self
         pickerView = UIPickerView()
         pickerView.dataSource = myClassSource
         pickerView.delegate = myClassSource

         // set the input view of the job type to be a picker view
         textInput.inputView = pickerView
         textInput.text = jobTypePickerValues[0]
     

      func selectedItem(item: String) 

          textInput.text = item
      

【讨论】:

谢谢这回答了我的问题,但我想我需要在 MyClass 类中添加,我必须为更改事件添加侦听器,然后调用看起来像这样的委托方法 'func pickerView(pickerView :UIPickerView,didSelectRow 行:Int,inComponent 组件:Int)委托? selectedItem("这正在被发送到 ViewController") ' @Matt 是的,我忘了添加代码 delegate?. selectedItem("this is being sent to the ViewController") 但除此之外没有问题。 欢迎马特,快乐编码:) 能否请您也投票,以便对其他人也有帮助:)

以上是关于如何在以编程方式创建的 UIPicker Delegate 中返回选定的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在以编程方式创建实体时设置 NSManagedObjectModel 的配置。

IOS5 - 如何在以编程方式创建的视图中播放视频?

如何在以编程方式创建的 UIButton 上添加 padding-left?

故事板集合视图拒绝在以编程方式创建的按钮前面

iOS:以编程方式在以编程方式创建的滚动视图中创建标签

在以编程方式创建的 UICollectionView 中未调用 didDeselectItemAtIndexPath 函数