2016-06-29 10 views
1

Ich benutze die Xcode 8 und schnelle 2.3, aber ich traf ein Problem der UIPickerView.dataSource = (self as! UIPickerViewDataSource) funktioniert nicht zu verwenden, wenn ich func von UIPicker zu verwenden versuchen, dies ist mein Code:wie UIPicker datasource

import UIKit 

class ViewController: UIViewController { 

    let Num = ["1","2","3","4","5","6"] 

    @IBOutlet weak var UIPicker: UIPickerView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     func numberOfRows(inComponent component: Int) -> Int {return 1} 

     func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {return Num.count} 

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

     UIPicker.dataSource = (self as! UIPickerViewDataSource) 
     UIPicker.delegate = (self as! UIPickerViewDelegate) 
    } 

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

Wenn ich betreibe meinen Code, Warn Xcode den Code:

nicht Wert vom Typ werfen konnte 'test.ViewController' (0x1000bd8c0) zu 'UIPickerViewDataSource' (0x1ab289738). 2016-06-29 15: 33: 35.079300 test [474: 98176] Konnte den Wert des Typs 'test.ViewController' (0x1000bd8c0) nicht in 'UIPickerViewDataSource' (0x1ab289738) umwandeln.

+0

Ihre Klasse entspricht nicht dem Protokoll, das scheint hier ein klarer Fall zu sein. – holex

Antwort

4

hinzufügen UIPickerViewDataSource und UIPickerViewDelegate zu der Klassendeklaration:

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate 

und Typumwandlung nicht self mit verwenden:

override func viewDidLoad() { 
    super.viewDidLoad() 

    UIPicker.dataSource = self 
    UIPicker.delegate = self 
} 

Sie auch Ihre Methoden aus viewDidLoad Funktion bewegen muss, und korrigieren Sie sie ein wenig:

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

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {return Num.count} 

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

Beachten Sie, dass ich Ihnen empfehlen, Ihre Num und UIPicker Eigenschaften num und picker, umbenennen, so dass Sie sie nicht mit Klassennamen

Upd mischen: voll ViewController Code:

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 

    let Num = ["1","2","3","4","5","6"] 

    @IBOutlet weak var UIPicker: UIPickerView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     UIPicker.dataSource = self 
     UIPicker.delegate = self 
    } 

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {return 1} 
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {return Num.count} 
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {return Num[row]} 
} 
+0

thx 4 Ihre Antwort, wie Sie sagen, ich versuche, UIPickerViewDataSource und UIPickerViewDelegate der Klassendeklaration hinzuzufügen, aber Xcode wieder Erwärmung: Redundante Konformität von 'ViewController' zu Protokoll 'UIPickerViewDataSource', anderen Code wurde behoben, thx wieder. – JhonSteve

+0

@JhonSteve View Controller aus meiner Antwort kompiliert ohne Warnungen. Wahrscheinlich haben Sie eine Erweiterung von 'ViewController', die als 'UIPickerView' Delegate/dataSource gekennzeichnet ist? Wie auch immer, du solltest den ganzen relevanten Code posten, um Hilfe zu bekommen. –

+0

Es ist mein Xcode Erwärmung: (https://twitter.com/jhonsteve1987/status/748415522526498816) können Sie mir helfen, es zu beheben? – JhonSteve

1
import Foundation 
import UIKit 

class MakeReferralViewController: UITableViewController,UIPickerViewDelegate, UITextFieldDelegate,UIPickerViewDataSource { 

    @IBOutlet weak var makeReferralScroll: UIScrollView! 

    @IBOutlet weak var userTitleUITextView: UITextField! 
    var pickerData = ["Mr.", "Ms.", "Mrs.", "Miss."]; 
    var picker = UIPickerView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     picker.delegate = self 
     picker.dataSource = self 
     userTitleUITextView.inputView = picker 

     // Do any additional setup after loading the view, typically from a nib. 
    } 

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

    func textFieldDidBeginEditing(_ textField: UITextField) { 
     makeReferralScroll.setContentOffset(CGPoint(x:0,y:250), animated: true) 
    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     return true; 
    } 

    @available(iOS 10.0, *) 
    func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) { 
     makeReferralScroll.setContentOffset(CGPoint(x:0,y:0), animated: true) 
    } 


    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return pickerData.count 
    } 

    //MARK: Delegate 
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 

     return pickerData[row] 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
       userTitleUITextView.text = pickerData[row] 

    } 


}