小编Cla*_*lla的帖子

从外部类管理UIPickerView - 使用Swift

我似乎无法找到一个外部类管理ViewController中的视图的连接.我是iOS的新手,并且花了很多时间寻找解决方案.简单示例:

UIPickerView的子类

我创建了一个文件,它是UIPickerView的子类,并使其符合PickerView委托和数据源.

class MyPickerView: UIPickerView, UIPickerViewDelegate, UIPickerViewDataSource {
    //In here I conform to all the required methods...no problems there
}
Run Code Online (Sandbox Code Playgroud)

主视图控制器,带PletView的插座

在我的MainViewController中,我为我的选择器视图创建了一个插座.另外,在StoryBoard中,我将我的Picker View的"自定义类"连接到上面的MyPickerView.

class MainViewController: UIViewController {
    @IBOutlet weak var myPickerView: UIPickerView!

    override func viewDidLoad() {
        //how do I hookup my picker view class
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 如何告诉我的MainViewController我的子类"MyPickerView"正在管理它的选择器视图?

  2. 我如何在子类和视图控制器之间启用通信?

---------------------

更新:最终解决方案纳入@ Oscar的答案

@ Oscar的建议很棒.为了澄清,我希望我的PickerView子类是UIPickerView Delegate,因为Picker将始终具有相同的UI,并且有许多用于UI的PickerView委托方法.(attributionTitleForRow,widthForComponent,rowHeightForComponent等)我不想在每个使用此PickerView的ViewController中调用这些委托方法.

现在,当调用PickerView"didSelectRow"时,我们需要通知我们的ViewController并传递所选的值.为了实现这一点,我使用了一个协议.(总结如下)这个主题花了我一些时间来学习,但是至关重要,所以如果这没有意义,我建议花时间与Protocols&Delegation合作.

  1. 在PickerView中创建一个带有func的协议,该func将用于与呈现此PickerView的ViewControllers通信:

    protocol MyPickerViewProtocol {
        func myPickerDidSelectRow(selectedRowValue:Int?)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在呈现PickerView的ViewController中,符合您的PickerView协议.通过这样做,您必须将func myPickerDidSelectRow放在ViewController中的某个位置:

    class MyViewController: MyPickerViewProtocol {
        func myPickerDidSelectRow(selectedRowValue:Int?) { 
            //do stuff to update your ViewController 
        } …
    Run Code Online (Sandbox Code Playgroud)

delegates subclass uipickerview ios swift

6
推荐指数
1
解决办法
5095
查看次数

标签 统计

delegates ×1

ios ×1

subclass ×1

swift ×1

uipickerview ×1