在swift中设置Picker

时间:2015-11-03 15:05:16

标签: ios xcode swift uipickerview picker

我正在尝试创建一个选择器,以便用户可以选择那里的标题(mr / mrs等)但是我一直得到2个错误

1:类型'ViewController'不符合协议'UIPickerViewDataSource'

2:定义与先前值冲突

第一个是在类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.
}
}

2 个答案:

答案 0 :(得分:2)

您已在numberOfComponentsInPickerView的定义中加入pickerView(_:numberOfRowsInComponent:)titlepicker(_:titleForRow:forComponent:)didReceiveMemoryWarning 的定义。 Swift支持嵌套函数,因此这是合法的语法。但是,因为它们是在didReceiveMemoryWarning中定义的,所以这些函数不是实例方法,因此它们不符合UIPickerViewDataSource协议的要求。

如果正确缩进代码,则更容易看到此类问题。然后这三个函数缩进了一个额外的级别,表明它们嵌套在didReceiveMemoryWarning中。您可以使用菜单选项Edit&gt;修复整个文件的缩进。选择全部(默认快捷键:⌘A),然后选择菜单选项编辑器&gt; <结构>重新缩进(默认快捷方式: ^ I )。

此外,在didReceiveMemoryWarning之外移动定义后,如果您希望将titlepicker(_:titleForRow:forComponent:)用作pickerView(_:titleForRow:forComponent:)的一部分,则需要将UIPickerViewDelegate重命名为didReceiveMemoryWarning协议

更新

好的,现在你已经从viewDidLoad中取出了三个函数并将它们放在viewDidLoad中,出于完全相同的原因这是错误的。这些功能需要与didReceiveMemoryWarning $class = "11"; $classes = array_reverse(array( '1', '2', '4', '5', '6', '7', '8', '9', '10', '11' )); $replacements = array_reverse(array( 'Warrior', 'Paladin', 'Hunter', 'Rogue', 'Priest', 'Death Knight', 'Shaman', 'Mage', 'Warlock', 'Monk', 'Druid' )); $resultclass = str_replace( $classes, $replacements, $class ); var_dump($resultclass); 处于同一级别。

答案 1 :(得分:1)

第二个错误是因为,最后三个函数,例如numberOfComponentsInPickerView错过了didReceiveMemoryWarning函数。

因此存在第一个错误,因为XCode无法找到UIPickerViewDataSource

的“必需”功能