前一段时间实在是腾不出时间来弄这些东西,所以好久没上博客,都荒废了,不过我最近在用swift开发项目,估计以后就转战swift了,小伙伴们顶一下吧!
项目中遇到好多问题现在就与大家分享一下吧,今天就先说说系统的一个控件PickerView,用的不好,大神们见谅哦!
pickerView和我们经常用的tableView一样也有几个必需遵循的协议
UIPickerViewDataSource协议
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { }//指定pickerView的列数
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { }//指定pickerView每列的行数
UIPickerViewDelegate协议
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { }//当前列当前行的title
func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {}//返回的行高
func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat { }//每一列的宽度
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {}//点击方法
话不多说,上代码
自定义HomepagePickerView类
import UIKit class HomepagePickerView: UIPickerView ,UIPickerViewDelegate, UIPickerViewDataSource { // --- init override init(frame: CGRect) { super.init(frame: frame) self.delegate = self self.dataSource = self self.backgroundColor = UIColor.whiteColor() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } var dataArray = NSArray() { willSet(newValue) { self.dataArray = newValue } didSet { self.reloadComponent(0) } } var detailArray = NSArray() { willSet(newValue) { self.detailArray = newValue } didSet { self.reloadComponent(1) } } // --- 回调函数 var onTwoComponentSelected: ((component1Text: String, component2Text: String) -> Void)? var onOneComponentSelected : ((component1Text: String) -> Void)? /// ---- UIPickerViewDelegate func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { if self.detailArray.count != 0 { return 2 }else{ return 1 } } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if self.detailArray.count != 0 { if component == 0 { return dataArray.count }else{ return detailArray.count } }else{ return dataArray.count } } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if self.detailArray.count != 0 { if component == 0 { return "\(dataArray[row])" }else{ return detailArray[row] as? String } }else{ return dataArray[row] as? String } } func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 40 } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if self.detailArray.count != 0 { let str1 = dataArray[self.selectedRowInComponent(0)] as! String let str2 = detailArray[self.selectedRowInComponent(1)] as! String if let block = onTwoComponentSelected { block(component1Text: str1,component2Text:str2) } }else{ let str1 = dataArray[self.selectedRowInComponent(0)] as! String if let block = onOneComponentSelected { block(component1Text: str1) } } } func showPickerView() { UIApplication.sharedApplication().keyWindow?.addSubview(self) } } ViewController.swift中调用
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. setPickerView() } func setPickerView() { let pickerView = HomepagePickerView.init(frame: CGRectMake(0, self.view.frame.size.height - 200, self.view.bounds.size.width, 200)) pickerView.dataArray = ["wet","ery","sdg","sag","dsfh"] pickerView.detailArray = ["214","346"] self.view.addSubview(pickerView) //当detailArray != nil的时候 pickerView.onOneComponentSelected = { (component1Text: String) in print(component1Text) }
//当detailArray == nil的时候 pickerView.onTwoComponentSelected = { (component1Text: String, component2Text: String) in print(component1Text) print(component2Text) } }
代码下载
