前一段时间实在是腾不出时间来弄这些东西,所以好久没上博客,都荒废了,不过我最近在用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)
}
}