swift中UIPickerView的使用

https://github.com/potato512/SYSwiftLearning


示例代码如下:

1、参数定义

let width:CGFloat = (UIScreen.mainScreen().bounds.size.width / 3.0)
var label:UILabel?
var addressArray:Array<AnyObject>?
var cityArray:Array<AnyObject>?
var areaArray:Array<AnyObject>?
    
var textSelected1:String!
var textSelected2:String!
var textSelected3:String!

2、数据源模拟

// 数据
self.loadAddress()

// MARK: - 数据
func loadAddress()
{
        // 广西
        let cityArea011 = ["cityName":"南宁市","cityArea":["南宁市","隆安县","武鸣县","马山县","宾阳县","横县","芭乐县","上林县"]]
        let cityArea012 = ["cityName":"百色市","cityArea":["百色市","隆林各族自治县","西林县","田林县","乐业县","凌云县","田阳县","田东县","平果县","德宝县","靖西县","那坡县"]]
        let cityArea013 = ["cityName":"桂林市","cityArea":["桂林市","龙胜各簇自治县","资源县","全州县","兴安县","灵川县","灌阳县","恭城瑶族自治县","平乐县","荔浦县","阳朔县","临桂县","永福县"]]
        let provinceCity01 = ["provinceName":"广西省","provinceCity":[cityArea011,cityArea012,cityArea013]]
        // 广东
        let cityArea021 = ["cityName":"梅州市","cityArea":["梅江区","梅县","蕉岭县","大埔县","丰顺县","平远县","兴宁市"]]
        let cityArea022 = ["cityName":"广州市","cityArea":["越秀","海珠","荔湾","天河","白云","黄埔","南沙","萝岗"]]
        let cityArea023 = ["cityName":"深圳市","cityArea":["龙岗区","宝安区","光明新区","坪山新区","罗湖区","福田区","盐田区","南山区"]]
        let cityArea024 = ["cityName":"惠州市","cityArea":["惠城区","惠东县","惠阳市","龙门县","博罗县"]]
        let provinceCity02 = ["provinceName":"广东省","provinceCity":[cityArea021,cityArea022,cityArea023,cityArea024]]
        
        self.addressArray = [provinceCity01,provinceCity02]
        
        self.cityArray = []
        self.areaArray = []
}

3、picker view使用

3-1、初始化定义

// 实例化(注:UIPickerView的宽高认分别是屏幕宽度、216的高度)
let pickerview = UIPickerView()
print(pickerview)
self.view.addSubview(pickerview)
pickerview.backgroundColor = UIColor.greenColor()
        
// 设置代理(注意添加代理协议,实现代理方法)
pickerview.dataSource = self
pickerview.delegate = self
        
// 设置选择框的认值
pickerview.selectRow(0,inComponent:0,animated:true)
pickerview.selectRow(0,inComponent:1,inComponent:2,animated:true)
        
// 刷新数据
// 刷新全部数据
pickerview.reloadAllComponents()
// 刷新某列数据
// pickerview.reloadComponent(1)

3-2、添加协议

class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {

....
}

3-3、代理方法实现

// MARK: - UIPickerViewDataSource,UIPickerViewDelegate
// MARK: UIPickerViewDataSource
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
{
        // 选择框列数
        return 3
}
    
func pickerView(pickerView: UIPickerView,numberOfRowsInComponent component: Int) -> Int
{
        // 每个选择框的行数
        if 0 == component
        {
            // 第一列
            let count = self.addressArray!.count
            return count
        }
        else if 1 == component
        {
            // 第二列
            let count = self.cityArray!.count
            return count
        }
        else if 2 == component
        {
            // 第三列
            let count = self.areaArray!.count
            return count
        }
        
        return 0
}
    
// MARK: UIPickerViewDelegate
func pickerView(pickerView: UIPickerView,widthForComponent component: Int) -> CGFloat
{
        // 每个选择框的行宽
        return width
}
    
func pickerView(pickerView: UIPickerView,rowHeightForComponent component: Int) -> CGFloat
{
        // 每个选择框的行高
        return 40.0
}
    
func pickerView(pickerView: UIPickerView,titleForRow row: Int,forComponent component: Int) -> String?
{
        // 每个选择框每行的显示内容
        if 0 == component
        {
            // 第一列
            let dictProvince = self.addressArray![row]
            let province:String! = dictProvince.objectForKey("provinceName") as! String
            return province
        }
        else if 1 == component
        {
            // 第二列
            let dict = self.cityArray![row]
            let city:String! = dict.objectForKey("cityName") as! String
            return city
        }
        else if 2 == component
        {
            // 第三列
            let area:String! = self.areaArray![row] as! String
            return area
        }
        
        return nil
}
    
func pickerView(pickerView: UIPickerView,attributedTitleForRow row: Int,forComponent component: Int) -> NSAttributedString?
{
        // 每个选择框每行的显示副文本内容
        return nil
}
    
func pickerView(pickerView: UIPickerView,viewForRow row: Int,forComponent component: Int,reusingView view: UIView?) -> UIView
{
        // 每个选择框每行自定义视图
        let label = UILabel(frame: CGRectMake(0.0,0.0,width,40.0))
        label.backgroundColor = UIColor.orangeColor()
        label.textAlignment = NSTextAlignment.Center
        
        if 0 == component
        {
            // 第一列
            let dict = self.addressArray![row]
            let province:String! = dict.objectForKey("provinceName") as! String
            label.text = province
        }
        else if 1 == component
        {
            // 第二列
            let dict = self.cityArray![row]
            let city:String! = dict.objectForKey("cityName") as! String
            label.text = city
        }
        else if 2 == component
        {
            // 第三列
            let area:String! = self.areaArray![row] as! String
            label.text = area
        }
        
        return label
}
    
func pickerView(pickerView: UIPickerView,didSelectRow row: Int,inComponent component: Int)
{
        // 每个选择框每行被选中的值
        print(component,row)
  
        if 0 == component
        {
            // 第一列时的行数
//            textSelected1 = String("1列 \(row) 行")
            
            let dict = self.addressArray![row]
            textSelected1 = dict.objectForKey("provinceName") as? String
            
            // 第二、三列关联改变
            self.cityArray! = dict["provinceCity"] as! Array
            pickerView.reloadComponent(1)
            pickerView.selectRow(0,inComponent: 1,animated: true)
            let dict2 = self.cityArray![0]
            textSelected2 = dict2.objectForKey("cityName") as! String
            
            let dict3 = self.cityArray![0]
            self.areaArray! = dict3["cityArea"] as! Array
            pickerView.reloadComponent(2)
            pickerView.selectRow(0,inComponent: 2,animated: true)
            textSelected3 = self.areaArray![0] as! String
        }
        else if 1 == component
        {
            // 第二列时的行数
//            textSelected2 = String("2列 \(row) 行")
            
            let dict = self.cityArray![row]
            textSelected2 = dict.objectForKey("cityName") as! String
            
            // 第三列关联改变
            self.areaArray! = dict["cityArea"] as! Array
            pickerView.reloadComponent(2)
            pickerView.selectRow(0,animated: true)
            textSelected3 = self.areaArray![0] as! String
        }
        else if 2 == component
        {
            // 第三列时的行数
//            textSelected3 = String("3列 \(row) 行。")
            
            textSelected3 = self.areaArray![row] as! String
        }
        let text = String("你选择了:\(textSelected1),\(textSelected2),\(textSelected3)")
        self.label!.text = text
}

4、显示选择结果

self.label = UILabel(frame: CGRectMake(10.0,(CGRectGetHeight(self.view.bounds) - 10.0 - 40.0),(CGRectGetWidth(self.view.bounds) - 10.0 * 2),40.0))
self.view.addSubview(self.label!)
self.label!.backgroundColor = UIColor.yellowColor()
self.label!.textColor = UIColor.redColor()
self.label!.autoresizingMask = UIViewAutoresizing.FlexibletopMargin

5、注意事项

(1)标题内容"func pickerView(pickerView: UIPickerView,forComponent component: Int) -> String? { }"设置与自定义视图"func pickerView(pickerView: UIPickerView,reusingView view: UIView?) -> UIView { }"不能同时设置,否则只有自定义视图有效。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...