2015-02-08 3 views
2

После вытаскивания приложения, которое было создано с помощью Swift 6, теперь система, использующая 6 бета-версий, я получаю «EventFormViewController не соответствует протоколу UIPickerViewDataSource». Я боролся с этим несколько дней, какие-то предложения?Swift не соответствует протоколу

import UIKit 

var eventChoices = [ 
    ["5","10","15","30","45","60","90","120","150","180"], 
    ["Hospital Committee","Peer Review","EHR Improvement","Quality Improvement","Business Development"], ] 

class EventFormViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate{ 


    @IBOutlet weak var eventPicker: UIPickerView! 
    @IBOutlet weak var eventLabel: UILabel! 
    @IBOutlet weak var commentField: UITextField! 


    func updateLabel(){ 
     let selectedTime = eventChoices[0][eventPicker.selectedRowInComponent(0)] 
     let event = eventChoices[1][eventPicker.selectedRowInComponent(1)] 


     eventLabel.text = "Chose \(event) for \(selectedTime) mins" 
    } 

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     updateLabel() } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     } 


     // Do any additional setup after loading the view. 




    } 

func didReceiveMemoryWarning() { 
    didReceiveMemoryWarning()  // Dispose of any resources that can be recreated. 
    } 

    // returns the number of 'columns' to display. func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return eventChoices.count } 

    // returns the # of rows in each component.. 
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ 

     return eventChoices[component].count 



    } 



    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { 
     return eventChoices[component][row] } 

    func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat { 
     if (component == 0) { 
      return 50.0; 
     } 
     return 300.0; 
    } 



    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 
+1

Можете ли вы подробнее рассказать? Что вы подразумеваете под Swift 6? Почему вы используете бета-версию 6? Вы пробовали убедиться, что вы внедрили все методы, требуемые протоколом? –

+2

Просто прочитайте журнал сборки в навигаторе отчетов. Компилятор сообщает вам, какой метод протокола отсутствует. –

+0

Вы используете тот же самый код? –

ответ

3

Есть много проблем в вашем коде.

Заголовок функции комментируется.

// returns the number of 'columns' to display. func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return eventChoices.count } 

Это должно быть, как:

Вы закрываете свое право определения класса после viewDidLoad реализации.

Это должно быть как:

import UIKit 

var eventChoices = [ 
    ["5","10","15","30","45","60","90","120","150","180"], 
    ["Hospital Committee","Peer Review","EHR Improvement","Quality Improvement","Business Development"], ] 

class EventFormViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate 
{ 


    @IBOutlet weak var eventPicker: UIPickerView! 
    @IBOutlet weak var eventLabel: UILabel! 
    @IBOutlet weak var commentField: UITextField! 


    func updateLabel() 
    { 
     let selectedTime = eventChoices[0][eventPicker.selectedRowInComponent(0)] 
     let event = eventChoices[1][eventPicker.selectedRowInComponent(1)] 


     eventLabel.text = "Chose \(event) for \(selectedTime) mins" 
    } 

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    { 
     updateLabel() 
    } 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning()  // Dispose of any resources that can be recreated. 
    } 

    // returns the number of 'columns' to display. 
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int 
    { 
     return eventChoices.count 
    } 

    // returns the # of rows in each component.. 
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
    { 
     return eventChoices[component].count 
    } 

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! 
    { 
     return eventChoices[component][row] 
    } 

    func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat 
    { 
     var width = 300.0 
     if (component == 0) 
     { 
      width = 50.0; 
     } 
     return width; 
    } 



    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 
} 
1

У вас есть некоторая набрав-ошибку:

Перед ваш didReceiveMemoryWarning у вас есть закрывающая скобка, закрывающий класс. Таким образом, ваши другие методы не входят в класс с UIPickerViewDelegate, и поэтому делегат считает, что методов не существует.

Итак, переместите скобу в конец вашего кода, чтобы закрыть класс.

Во-вторых, у вас есть ошибка после метода didReceiveMemoryWarning. Вы получили outcommented по методу заголовок:

// returns the number of 'columns' to display. func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return eventChoices.count } 

Так изменить, что выглядеть:

// returns the number of 'columns' to display. 
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return eventChoices.count 
} 

И последнее, но вы не в последнюю очередь нужно переопределить метод didReceiveMemoryWarning. Так что изменить:

func didReceiveMemoryWarning() { 
    didReceiveMemoryWarning()  // Dispose of any resources that can be recreated. 
    } 

в том, что:

override func didReceiveMemoryWarning() { 
    didReceiveMemoryWarning()  // Dispose of any resources that can be recreated. 
} 
Смежные вопросы