代码之家  ›  专栏  ›  技术社区  ›  L'lynn

UIPickerView未填充

  •  1
  • L'lynn  · 技术社区  · 7 年前

    欢呼,

    //我的委托和数据源 导入基础

    class MyPickerView: NSObject{
    var data = PickerViewData.getData()
    
    
    
    }
    extension MyPickerView: UIPickerViewDataSource{
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return 1
    }
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return self.data.count
    }    
    }
    
    extension MyPickerView: UIPickerViewDelegate{
    func pickerView(_ pickerView: UIPickerView, rowHeightForComponent 
    component: Int) -> CGFloat {
        return 100
    }
    
    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, 
    forComponent component: Int, reusing view: UIView?) -> UIView {
    
        let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        let dayLbl = UILabel(frame: CGRect(x: 0, y: 10, width: 100, height: 15))
        let priceLbl = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        let petLbl = UILabel(frame: CGRect(x: 0, y: 78, width: 100, height: 15))
        dayLbl.text = data[row].dayName
        priceLbl.text = String(data[row].price)
        petLbl.text = data[row].petName
    
        dayLbl.textAlignment = .center
        priceLbl.textAlignment = .center
        petLbl.textAlignment = .center
        view.addSubview(dayLbl)
        view.addSubview(priceLbl)
        view.addSubview(petLbl)
        return view
    }
    

    }

    //我的模型

    import Foundation
    
    struct PickerViewModel{
    var dayName:String!
    var price:Double!
    var petName:String!
    init(dayName:String,price:Double,petName:String) {
        self.dayName = dayName
        self.price = price
        self.petName = petName
    }
    
    }
    struct PickerViewData {
    static func getData() -> [PickerViewModel]{
        let m = PickerViewModel(dayName: "Pazartesi", price: 32.3, 
    petName: "Köpek")
        let p = PickerViewModel(dayName: "Salı", price: 32.3, petName: 
    "Kuş")
        let z = PickerViewModel(dayName: "Çarşamba", price: 32.3, 
    petName: "Kedi")
        let t = PickerViewModel(dayName: "Perşembe", price: 32.3, 
    petName: "Domuz")
        let k = PickerViewModel(dayName: "Cuma", price: 32.3, petName: 
    "Kanarya")
        return [m,p,z,t,k]
    }
    }
    

    //我的控制器

    import UIKit
    
    class FirstVC: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        let pickerView = UIPickerView(frame: CGRect(x: 100, y: 100, 
    width: 200, height: 500))
        let deldat = MyPickerView()
        pickerView.delegate = deldat
        pickerView.dataSource = deldat
        self.view.addSubview(pickerView)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }    
    
    } 
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Paulw11    7 年前

    选择器视图的 dataSource delegate 属性声明为 weak MyPickerView 例子由于您的实例是局部变量,只要 viewDidLoad 退出,它将被释放。

    你需要保持冷静 实例属性中的实例,以便在视图控制器的生命周期内保留该实例:

    import UIKit
    
    class FirstVC: UIViewController {
    
        private var deldat: MyPickerView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.view.backgroundColor = .white
            let pickerView = UIPickerView(frame: CGRect(x: 100, y: 100, 
    width: 200, height: 500))
            self.deldat = MyPickerView()
            pickerView.delegate = deldat
            pickerView.dataSource = deldat
            self.view.addSubview(pickerView)
        }
    }