My Swift UIPickerView doesn't display rows after I added viewForRow

28 Views Asked by At

When I use titleForRow, my UIPickerView works ok.

But when I removed titleForRow and added viewForRow to have it show multiple lines, the viewForRow fires for each row but doesn't display rows.

THE CODE..............................

class CentralViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource


func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
    return 80.0
}


func open_mode_UIPickerView()
{
    oximeter_mode_UIPickerView = UIPickerView()
        oximeter_mode_UIPickerView.delegate = self
        oximeter_mode_UIPickerView.dataSource = self
        oximeter_mode_UIPickerView.backgroundColor = UIColor.white
        oximeter_mode_UIPickerView.setValue(UIColor.black, forKey: "textColor")
        oximeter_mode_UIPickerView.autoresizingMask = .flexibleWidth
        oximeter_mode_UIPickerView.contentMode = .center
        mode_UIPickerView_x =           0
        mode_UIPickerView_y =           10
        mode_UIPickerView_width =       Int( UIScreen.main.bounds.size.width / 3 )
        mode_UIPickerView_height =      300
        oximeter_mode_UIPickerView.frame = CGRect.init(    x: mode_UIPickerView_x, 
                                                            y: mode_UIPickerView_y, 
                                                            width: mode_UIPickerView_width, 
                                                            height: mode_UIPickerView_height)
        self.view.addSubview( oximeter_mode_UIPickerView )
        view.bringSubviewToFront( oximeter_mode_UIPickerView )
}



func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView 
{
    let label: UILabel

    if let view = view {
        label = view as! UILabel
    }
    else {
        label = UILabel(frame: CGRect(  x: mode_UIPickerView_x, 
                                         y: mode_UIPickerView_y, 
                                         width: mode_UIPickerView_width, 
                                         height: mode_UIPickerView_height ))
    }


    label.text = ""
        label.lineBreakMode = .byWordWrapping
        label.numberOfLines = 0
        // Use viewForRow, to support multiline
            if row == 0
            {
              label.text = "Oxi mode 0" 
                            + "\n Red    Red"
                            + "\n 620    660"
                print("titleForRow     label.text", label.text )       /////////  THIS PRINTS OK
            }                                                        
            if row == 1
            {
              label.text = "Oxi mode 1" 
                            + "\n Orange Red"
                            + "\n 590    730"
                print("titleForRow     label.text", label.text )       /////////  THIS PRINTS OK
            }                                                        
            if row == 2
            {
              label.text = "Oxi mode 2" 
                            + "\n Violet IR"
                            + "\n 420    830"
                print("titleForRow     label.text", label.text )       /////////  THIS PRINTS OK
            }                                                        
            if row == 3
            {
              label.text = "Oxi mode 3"
                            + "\n Green  IR"
                            + "\n 520    940"
                print("titleForRow     label.text", label.text )      /////////  THIS PRINTS OK
            }                                                        
        label.sizeToFit()
     return label
}

BREAKPOINT AT END OF titleForRow......................

<UILabel: 0x104e20dd0; frame = (0 10; 87.3333 61); text = 'Oxi mode 0 Red Red 6...'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x281d830c0>>

1

There are 1 best solutions below

0
Doug Null On

PROBLEM...

let label <<<<<<<<<<< ERROR. NEEDED TO BE CLASS LEVEL, NOT FUNC LEVEL

ie. var label: UILabel! ...at class level.