我希望在一个场景中有多个UIPickerViews,而不使用委托函数使视图控制器膨胀。我在UIPickerViews上看到的所有教程都建议使用视图控制器本身作为UIPickerView的委托。
如何将此委托代码移出ViewController
this tutorial启发,这里有一个视图控制器,它将自己指定为UIPickerViews的委托。我对用于将行为映射到每个UIPickerView的if/else逻辑持批评态度:

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var pickerViewA: UIPickerView!
    @IBOutlet weak var pickerViewB: UIPickerView!

    let contentsA = ["1A", "2A", "3A"]
    let contentsB = ["1B", "2B", "3B", "4B"]

    override func viewDidLoad() {
        super.viewDidLoad()
        pickerViewA.delegate   = self
        pickerViewA.dataSource = self
        pickerViewB.delegate   = self
        pickerViewB.dataSource = self
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1 //Applies to both pickerViewA & pickerViewB
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView == pickerViewA {
            return contentsA.count
        } else {
            return contentsB.count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == pickerViewA {
            return contentsA[row]
        } else {
            return contentsB[row]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == pickerViewA {
            // Do something A
        } else {
            // Do something B
        }
    }
}

理想情况下,我希望有一个符合这些协议的自定义类,然后为每个UIPickerView创建一个此类的新实例,以便它们具有唯一的委托和行为。
当我试图定义一个名为“PickerDelegate”的独立类,它符合UIPickerViewDelegate&UIPickerViewDataSource时,我在Xcode中得到这个错误:
类型“PickerDelegate”不符合协议“NSObjectProtocol”
显然,从UIPickerViewDelegate继承。如果我添加协议存根(如Xcode所建议的那样),就会得到一长串我不喜欢实现的函数。
在视图控制器之外,是否有更简单的方法来遵循这些协议?

最佳答案

当我试图定义一个名为“PickerDelegate”的独立类,该类符合UIPickerViewDelegate&UIPickerViewDataSource时,在Xcode中会出现此错误:
只需将PickerDelegate设为NSObject的子类。

class PickerDelegate : NSObject, UIPickerViewDelegate, UIPickerViewDataSource {

这不是强加的,而且是必要的,因为Cocoa是Objective-C,甚至不能看到委托和数据源方法。

关于ios - 如何在ViewController之外符合UIPickerViewDelegate和UIPickerViewDataSource?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57138766/

10-12 05:32