39

我只是在 Swift 中创建了一个新类,它被称为myViewController,它是一个UIViewController. 现在我试图让它成为 UIPickerViewDelegate 和 DataSource 但我遇到了一个奇怪的错误

import UIKit

class myViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
   ...
}

Type "myViewController" does not conform to protocol UIPIckerDataSource在 UIPickerViewDataSource 上说。

它是 Xcode-Beta 3 的错误吗?

编译时错误的屏幕截图

4

5 回答 5

55

如果要遵守这些协议,则需要实现UIPickerViewDataSourceand的所有必需方法。UIPickerViewDelegate

Swift 在协议方面更像 java,因为如果您不实现协议声明的所有必需方法,您将获得编译时错误而不是运行时异常。

于 2014-07-26T12:27:59.923 回答
15

如果您使用的是 Swift 3,XCode 8.1 中的 Fix-it 会插入以下方法的弃用版本:

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return componentNumber
}

在 XCode 10.0+ 中

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return componentNumber
}
于 2016-12-07T00:04:57.747 回答
11

实施UIPickerDataSource文档中所需的方法。

数据源为选择器视图提供组件数以及每个组件中的行数,用于显示选择器视图数据。本协议中的两种方法都是必需的。

所以你需要实现这些方法

func numberOfComponentsInPickerView(_ pickerView: UIPickerView!) -> Int {}

   func pickerView(_ pickerView: UIPickerView!,
numberOfRowsInComponent component: Int) -> Int{}
于 2014-07-26T12:33:52.603 回答
0

我的问题是我override在实现函数前面,Swift 不认为协议方法实现是覆盖(相同)。只需取出override关键字即可解决问题。

于 2015-07-28T21:17:47.310 回答
0

我的问题是协议的方法名称是非法的,

@protocol ContactsSelectDelegate <NSObject>

- (void)selectContacts:(NSMutableArray *)contacts Tags:(NSMutableArray *)tags;

@end

在这里,Tags:应该是tags:
我希望我的回答有帮助。

于 2016-04-26T17:45:23.093 回答