首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何符合UIPickerViewDelegate和UIPickerViewDataSource以外的ViewController?

如何符合UIPickerViewDelegate和UIPickerViewDataSource以外的ViewController?
EN

Stack Overflow用户
提问于 2019-07-22 03:15:10
回答 2查看 944关注 0票数 0

我希望在一个场景中有多个UIPickerViews,而不让我的视图控制器有委托功能。我在UIPickerViews上看到的所有教程都建议使用视图控制器本身作为UIPickerView的委托。

如何将此委托代码从ViewController中移出

本教程的启发,这里有一个视图控制器,它将自己指定为它的UIPickerViews的委托。我批评用于将行为映射到每个UIPickerView的if/ each逻辑。

代码语言:javascript
复制
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 & UIPickerViewDataSource是从NSObjectProtocol继承的。如果我添加协议存根(正如Xcode所建议的那样),我会得到一长串我不喜欢实现的函数。

在视图控制器之外,是否有更简单的方法来遵守这些协议?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-22 03:18:03

当我试图定义一个名为“PickerDelegate”的单独类时,它符合UIPickerViewDelegate & UIPickerViewDataSource,我在Xcode中得到了这个错误:

只需将PickerDelegate作为NSObject的子类即可。

代码语言:javascript
复制
class PickerDelegate : NSObject, UIPickerViewDelegate, UIPickerViewDataSource {

这不是强制性的,也是必要的,因为Cocoa是Objective,否则甚至无法看到您的委托和数据源方法。

票数 3
EN

Stack Overflow用户

发布于 2019-07-22 07:46:50

您可以添加像这样的扩展,并且在任何想要使用UIviewController的UIpiker中,只需设置视图中的didload()中的委托

代码语言:javascript
复制
extension UIViewController: UIPickerViewDelegate, UIPickerViewDataSource {
    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
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57138766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档