Search code examples
iosswiftuipickerview

two labels for each row with pickerView


I'm trying to implement the viewForRow delegate so I can have two labels for each row. I currently have it working with just one label per row. Any help is highly appreciated.

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {
    var returnLabel = view as UIView!

    if view == nil {
        returnLabel = UIView()
    }

    var pickerLabel = view as! UILabel!
    if view == nil {
        pickerLabel = UILabel()
    }

    let titleData = List

    let myTitle = NSAttributedString(string: titleData[row], attributes: [NSFontAttributeName:UIFont(name: "Helvetica Neue", size: 17.0)!,NSForegroundColorAttributeName:UIColor.whiteColor()])
    pickerLabel.attributedText = myTitle
    pickerLabel.textAlignment = .Center

     var pickerLabel2 = view as! UILabel!
     if view == nil {
         pickerLabel2 = UILabel()
     }

     let subtitleData = subtitleList

     let mySubtitleTitle = NSAttributedString(string: subtitleData[row], attributes: [NSFontAttributeName:UIFont(name: "Helvetica Neue", size: 12.0)!,NSForegroundColorAttributeName:UIColor.whiteColor()])
     pickerLabel2.attributedText = mySubtitleTitle
     pickerLabel2.textAlignment = .Left

    returnLabel.addSubview(pickerLabel)
    returnLabel.addSubview(pickerLabel2)

    return returnLabel
}

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

Solution

  • You did not specify frames for your labels. Refer to full snippet:

    class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
        let rowHeight:CGFloat = 60.0
        let List = ["data1_1", "data1_2", "data1_3"]
        let subtitleList = ["data2_1", "data2_2", "data2_3"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
        }
    
        func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {
    
            var returnLabel: UIView!
            var pickerLabel: UILabel!
            var pickerLabel2: UILabel!
    
            if view == nil {
                returnLabel = UIView(frame: CGRectMake(0, 0, pickerView.frame.size.width, rowHeight))
                pickerLabel = UILabel(frame: CGRectMake(0, 0, returnLabel.frame.size.width, rowHeight / 2))
                pickerLabel2 = UILabel(frame: CGRectMake(0, rowHeight / 2, returnLabel.frame.size.width, rowHeight / 2))
                returnLabel.addSubview(pickerLabel)
                returnLabel.addSubview(pickerLabel2)
            }
    
            // title
    
            let titleData = List
    
            let myTitle = NSAttributedString(string: titleData[row], attributes: [NSFontAttributeName:UIFont(name: "Helvetica Neue", size: 17.0)!,NSForegroundColorAttributeName:UIColor.whiteColor()])
            pickerLabel.attributedText = myTitle
            pickerLabel.textAlignment = .Center
    
            // subtitle
    
            let subtitleData = subtitleList
    
            let mySubtitleTitle = NSAttributedString(string: subtitleData[row], attributes: [NSFontAttributeName:UIFont(name: "Helvetica Neue", size: 12.0)!,NSForegroundColorAttributeName:UIColor.whiteColor()])
            pickerLabel2.attributedText = mySubtitleTitle
    
            return returnLabel
        }
    
        func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
            return rowHeight
        }
    
        func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
            return 1
        }
    
        func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return List.count
        }
    
    }