在 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" 函数

您已将 numberOfComponentsInPickerViewpickerView(_: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中了,这也是错误的,原因完全一样。这些功能需要与 viewDidLoaddidReceiveMemoryWarning.

处于同一级别