在 swift 中设置选择器
Setting up a Picker in swift
我正在尝试创建一个选择器,以便用户可以 select 标题(mr/mrs 等)但是我不断收到 2 个错误
1: 类型 'ViewController' 不符合协议 'UIPickerViewDataSource'
2:定义与之前的值冲突
第一个在 class viewcontoller 行(第 2 行)中。第二个错误出现在代码末尾的 titlepicker 函数中
我在网上搜索过,无论如何都能找到解决这些问题的方法
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource //first error here
{
@IBOutlet weak var titlepicker: UIPickerView!
var titlepickerdata : [String] = [String]()
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//connect data
self.titlepicker.delegate = self
self.titlepicker.dataSource = self
//input data into the array
titlepickerdata = ["Mr","Ms","Mrs","Miss","Other"]
// The number of columns of data
func numberOfComponentsInPickerView(titlepicker: UIPickerView) -> Int
{
return 1
}
// The number of rows of data
func pickerView(titlepicker: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
return titlepickerdata.count
}
// The data to return for the row and column that's being passed in
func pickerView(titlepicker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? // second error returned here
{
return titlepickerdata[row]
}
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
第二个错误是因为,最后三个函数,例如numberOfComponentsInPickerView
,在 didReceiveMemoryWarning
函数中错位了。
因此存在第一个错误,因为 XCode
无法找到 UIPickerViewDataSource
的 "required" 函数
您已将 numberOfComponentsInPickerView
、pickerView(_:numberOfRowsInComponent:)
和 titlepicker(_:titleForRow:forComponent:)
的定义放入 didReceiveMemoryWarning
的定义中。 Swift 支持嵌套函数,所以这是合法的语法。但是,因为它们是在 didReceiveMemoryWarning
中定义的,所以这些函数不是实例方法,因此它们不符合 UIPickerViewDataSource
协议的要求。
如果您正确地缩进代码,就更容易发现此类问题。然后将这三个函数缩进一个额外的级别,表明它们嵌套在 didReceiveMemoryWarning
中。您可以使用菜单选项 Edit > Select All(默认快捷方式:⌘A)修复整个文件的缩进,然后选择菜单选项 Editor > Structure > Re-Indent (默认快捷方式:⌃I
)。
此外,在将定义移到 didReceiveMemoryWarning
之外后,如果要将其用作 [=21] 的一部分,则需要将 titlepicker(_:titleForRow:forComponent:)
重命名为 pickerView(_:titleForRow:forComponent:)
=]协议。
更新
好的,现在你已经把didReceiveMemoryWarning
中的三个函数取出来放到viewDidLoad
中了,这也是错误的,原因完全一样。这些功能需要与 viewDidLoad
和 didReceiveMemoryWarning
.
处于同一级别
我正在尝试创建一个选择器,以便用户可以 select 标题(mr/mrs 等)但是我不断收到 2 个错误
1: 类型 'ViewController' 不符合协议 'UIPickerViewDataSource'
2:定义与之前的值冲突
第一个在 class viewcontoller 行(第 2 行)中。第二个错误出现在代码末尾的 titlepicker 函数中 我在网上搜索过,无论如何都能找到解决这些问题的方法
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource //first error here
{
@IBOutlet weak var titlepicker: UIPickerView!
var titlepickerdata : [String] = [String]()
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//connect data
self.titlepicker.delegate = self
self.titlepicker.dataSource = self
//input data into the array
titlepickerdata = ["Mr","Ms","Mrs","Miss","Other"]
// The number of columns of data
func numberOfComponentsInPickerView(titlepicker: UIPickerView) -> Int
{
return 1
}
// The number of rows of data
func pickerView(titlepicker: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
return titlepickerdata.count
}
// The data to return for the row and column that's being passed in
func pickerView(titlepicker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? // second error returned here
{
return titlepickerdata[row]
}
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
第二个错误是因为,最后三个函数,例如numberOfComponentsInPickerView
,在 didReceiveMemoryWarning
函数中错位了。
因此存在第一个错误,因为 XCode
无法找到 UIPickerViewDataSource
您已将 numberOfComponentsInPickerView
、pickerView(_:numberOfRowsInComponent:)
和 titlepicker(_:titleForRow:forComponent:)
的定义放入 didReceiveMemoryWarning
的定义中。 Swift 支持嵌套函数,所以这是合法的语法。但是,因为它们是在 didReceiveMemoryWarning
中定义的,所以这些函数不是实例方法,因此它们不符合 UIPickerViewDataSource
协议的要求。
如果您正确地缩进代码,就更容易发现此类问题。然后将这三个函数缩进一个额外的级别,表明它们嵌套在 didReceiveMemoryWarning
中。您可以使用菜单选项 Edit > Select All(默认快捷方式:⌘A)修复整个文件的缩进,然后选择菜单选项 Editor > Structure > Re-Indent (默认快捷方式:⌃I
)。
此外,在将定义移到 didReceiveMemoryWarning
之外后,如果要将其用作 [=21] 的一部分,则需要将 titlepicker(_:titleForRow:forComponent:)
重命名为 pickerView(_:titleForRow:forComponent:)
=]协议。
更新
好的,现在你已经把didReceiveMemoryWarning
中的三个函数取出来放到viewDidLoad
中了,这也是错误的,原因完全一样。这些功能需要与 viewDidLoad
和 didReceiveMemoryWarning
.