I am trying to add a custom UIViewController class (UIPickerView) to my main ViewController programmatically in Swift (without using a storyboard) but I get the following error message...
"Cannot convert value of type 'HabitViewViewController' to expected argument type 'UIView'
Custom UIPicker class:
    import UIKit
    class HabitViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate  {
        @IBOutlet weak var myPicker: UIPickerView!
        @IBOutlet weak var myLabel: UILabel!
        let pickerData = ["Mozzarella","Gorgonzola","Provolone","Brie","Maytag Blue","Sharp Cheddar","Monterrey Jack","Stilton","Gouda","Goat Cheese", "Asiago"]
        override func viewDidLoad() {
            super.viewDidLoad()
            myPicker.delegate = self
            myPicker.dataSource = self
        }
        //MARK: - Delegates and data sources
        //MARK: Data Sources
        func numberOfComponents(in pickerView: UIPickerView) -> Int {
            return 1
        }
        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return pickerData.count
        }
        //MARK: Delegates
        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
            return pickerData[row]
        }
        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            myLabel.text = pickerData[row]
        }
        func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
            let titleData = pickerData[row]
            let myTitle = NSAttributedString(string: titleData, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 26.0)!,NSForegroundColorAttributeName:UIColor.blue])
            return myTitle
        }
        func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
            var pickerLabel = view as! UILabel!
            if view == nil {  //if no label there yet
                pickerLabel = UILabel()
                //color the label's background
                let hue = CGFloat(row)/CGFloat(pickerData.count)
                pickerLabel?.backgroundColor = UIColor(hue: hue, saturation: 1.0, brightness: 1.0, alpha: 1.0)
            }
            let titleData = pickerData[row]
            let myTitle = NSAttributedString(string: titleData, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 26.0)!,NSForegroundColorAttributeName:UIColor.black])
            pickerLabel!.attributedText = myTitle
            pickerLabel!.textAlignment = .center
            return pickerLabel!
        }
    }
Main UIView
    import UIKit
    // Activity Month view Class (Type BaseCell - cleaner)
    class PlantCell: BaseCell {
        // UIpicker for habit
        let habitPicker: HabitViewController = {
            let habit = HabitViewController()
            return habit
        }()
        // Overrided as it uses the baseCell superclass
        override func setupViews() {
            // Add subviews
            addSubview(habitPicker)
            // Horizontal constraints
            addConstraintsWithFormat(format: "H:|-[v0]-|", views: habitPicker)
            // Vertical constraints
            addConstraintsWithFormat(format: "V:|-250-[v0(20)]", views: habitPicker)
        }
    }
BaseCell
    import UIKit
    // Superclass to initalise all base UICollectionView cells
    class BaseCell: UICollectionViewCell {
        override init(frame: CGRect) {
            // When dequeueReusableCell is called this init method is called if it needs a new cell
            super.init(frame: frame)
            setupViews()
        }
        func setupViews() {
        }
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
                addSubview(habitPicker)
The expected argument is UIView, so you can simple fix it by addSubview(habitPicker.view). And remember to adjust habitPicker.view frame size suitable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With