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