tigermatta tigermatta - 7 months ago 15
Swift Question

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
}

Answer

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
    }

}