swift 4.2代码实现选择器UIPickerView

本文详细介绍SwiftUI框架在iOS应用开发中的应用,包括界面构建、状态管理及响应式编程等核心概念。通过实例演示如何使用SwiftUI创建美观且交互丰富的用户界面,适合iOS开发者学习与实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

image.png

代码:

import UIKit

class ViewController: UIViewController ,UIPickerViewDelegate,UIPickerViewDataSource {
    
    var label: UILabel!
    var pickerView: UIPickerView!

    var pickerData :NSDictionary!  //保存全部数据
    var pickerProvincesData: NSArray!  //当前的省数据
    var pickerCitiesData: NSArray!  //当前省下面的市数据
    
    override func viewDidLoad() {
        super.viewDidLoad()

        
        let plistPath = Bundle.main.path(forResource: "provinces_cities", ofType: "plist")
        let dict = NSDictionary(contentsOfFile: plistPath!) //获取属性列表文件名中的全部数据
        self.pickerData = dict

        //省份名数据
        self.pickerProvincesData = self.pickerData.allKeys as NSArray
        
        //默认取出第一个省的所有市的数据
        let seletedProvince = self.pickerProvincesData[0] as! String
        self.pickerCitiesData = self.pickerData[seletedProvince] as! NSArray
        
        let screen = UIScreen.main.bounds
        
        //1.选择器
        let pickerViewWidth: CGFloat = 320
        let pickerViewHeight: CGFloat = 162
        self.pickerView = UIPickerView(frame: CGRect(x: 0, y: 0, width: pickerViewWidth, height: pickerViewHeight))
        self.view.addSubview(pickerView)
        
   
        //2. 添加标签
        let labelWidth: CGFloat = 200
        let labelHeight: CGFloat = 21
        let labelTopView: CGFloat = 273
        self.label = UILabel(frame: CGRect(x:0 , y: labelTopView, width: labelWidth, height: labelHeight))
        self.label.text = "Label"
        self.label.textAlignment = .center
        self.view.addSubview(self.label)
        
        //3.button代码实现
        let button = UIButton(type: UIButton.ButtonType.system)
        button.setTitle("OK", for: UIControl.State.normal)
        let buttonWidth: CGFloat = 46
        let buttonheight: CGFloat = 30
        let buttonTopView: CGFloat = 374
        button.frame = CGRect(x: (screen.size.width - buttonWidth)/2, y: buttonTopView, width: buttonWidth, height: buttonheight)
        //addTarget,第一个参数是事件处理者,第二个参数是选择器类型,它指向事件处理方法,第三个参数是事件.
        button.addTarget(self, action: #selector(onclick(sender:)), for: UIControl.Event.touchUpInside)
        self.view.addSubview(button)
        
        //将委托和数据源的实现对象ViewController分配给UIPickerView的委托属性delegate和数据源属性dataSource
        self.pickerView.dataSource = self
        self.pickerView.delegate = self
        
    }
    
    @objc func onclick(sender:AnyObject){
        
        let row1 = self.pickerView.selectedRow(inComponent: 0)
        let row2 = self.pickerView.selectedRow(inComponent: 1)
        let selected1 = self.pickerProvincesData[row1] as! String
        let selected2 = self.pickerCitiesData[row2] as! String
        
        let title = String(format:"%@ , %@市" , selected1 , selected2)
        self.label.text = title
    }
    
    //实现数据源协议
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        //选择器拨轮的数目
        return 2
    }
    
    //选择器某个拨轮的行数
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if(component == 0){
            //第一个拨轮省份个数
            return self.pickerProvincesData.count
        } else {
            //第二个拨轮城市个数
            return self.pickerCitiesData.count
        }
    }
    
    //实现委托协议
    //为选择器中某个拨轮的行提供显示数据
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (component == 0) {
            return self.pickerProvincesData[row] as? String
        } else {
            return self.pickerCitiesData[row] as? String
        }
    }
    //选择选择器的某个拨轮中的某行时调用
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if (component == 0){
            let seletedProvince = self.pickerProvincesData[row] as! String
            self.pickerCitiesData = self.pickerData[seletedProvince] as! NSArray
            self.pickerView.reloadComponent(1)
        }
    }

    
    
}
image.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值