ios – 带有“外部”DataSource的UIPickerView和Swift中的Delegate

前端之家收集整理的这篇文章主要介绍了ios – 带有“外部”DataSource的UIPickerView和Swift中的Delegate前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的视图中有两个不同的UIPickerView.当我将dataSource和委托设置为通过故事板托管的View时,它们工作得很好,但是当我尝试通过如下所述的代码执行此操作时,它不起作用.

两个选择器都应该有不同的数据来显示(甚至可能是代表的不同行为).因此,我想以编程方式将它们连接到不同的数据源.

我尝试创建自己的类,实现UIPickerViewDataSource-和UIPickerViewDelegate-Protocols,并将该类的对象连接到我的PickerViews,但它不起作用.在运行时抛出异常,终止时出现NSException类型的未捕获异常,说明:

  1. 2015-01-09 17:50:05.333 Pet Stats[4953:244338] -[NSConcreteMapTable numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7b4616d0
  2. 2015-01-09 17:50:05.338 Pet Stats[4953:244338] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: '-[NSConcreteMapTable numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7b4616d0'

我怎样才能让它发挥作用?我错过了什么?这是我的代码

WeightWheelController.swift

  1. import UIKit
  2.  
  3. class WeightWheelController: NSObject,UIPickerViewDelegate,UIPickerViewDataSource {
  4. let ElementCount: Int!
  5.  
  6. init(pickerInterval: Int) {
  7. ElementCount = pickerInterval
  8. }
  9.  
  10. func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
  11. return 1
  12. }
  13.  
  14. func pickerView(pickerView: UIPickerView,numberOfRowsInComponent component: Int) -> Int {
  15. return ElementCount
  16. }
  17.  
  18. func pickerView(pickerView: UIPickerView,titleForRow row: Int,forComponent component: Int) -> String! {
  19. return String(row + 1)
  20. }
  21.  
  22. func pickerView(pickerView: UIPickerView!,didSelectRow row: Int,inComponent component: Int)
  23. {
  24. println("External Controller:" + String(row + 1))
  25. }
  26. }

WeightWheelInputViewController.swift

  1. import UIKit
  2.  
  3. class WeightWheelInputViewController: UIViewController {
  4. @IBOutlet weak var picker1: UIPickerView!
  5. @IBOutlet weak var picker2: UIPickerView!
  6.  
  7. override func viewDidLoad() {
  8. super.viewDidLoad()
  9.  
  10. //picker attached to c1 should show number from 1 to 150
  11. let c1 = WeightWheelController(pickerInterval: 150)
  12.  
  13. //picker attached to c1 should show number from 1 to 10
  14. let c2 = WeightWheelController(pickerInterval: 10)
  15.  
  16. picker1.dataSource = c1
  17. picker1.delegate = c1
  18.  
  19. picker2.dataSource = c2
  20. picker2.delegate = c2
  21. }
  22.  
  23. override func didReceiveMemoryWarning() {
  24. super.didReceiveMemoryWarning()
  25. }
  26. }

最新消息:

在这个问题中,我发现您可以为不同的选择器视图使用不同的标签.这将是一种选择;但是,我不喜欢它.我想宁愿遵循MVC’的方法,并将不同的控制器连接到每个选择器.这有可能吗?

解决方法

@H_301_25@ 委托和数据源都是无主参考.这意味着一旦你超出范围,c1和c2就会被释放.尝试将c1和c2声明为类的属性.

无主引用不会对引用的对象产生强烈保持(例如,它们不会增加保留计数以防止ARC释放引用的对象).

还要确保从界面构建器中删除选取器视图的委托和数据源属性.

  1. class WeightWheelInputViewController: UIViewController {
  2. @IBOutlet weak var picker1: UIPickerView!
  3. @IBOutlet weak var picker2: UIPickerView!
  4.  
  5. var c1 : WeightWheelController!
  6. var c2 : WeightWheelController!
  7.  
  8. override func viewDidLoad() {
  9. super.viewDidLoad()
  10.  
  11. c1 = WeightWheelController(pickerInterval: 150)
  12.  
  13. c2 = WeightWheelController(pickerInterval: 10)
  14.  
  15. picker1.dataSource = c1
  16. picker1.delegate = c1
  17.  
  18. picker2.dataSource = c2
  19. picker2.delegate = c2
  20. }
  21.  
  22. override func didReceiveMemoryWarning() {
  23. super.didReceiveMemoryWarning()
  24. }
  25. }

猜你在找的iOS相关文章