Xcode Swift 3 Picker:将数据源放入ViewDidload中



我正在尝试设置一个根据某些条件显示不同结果的选择器。唯一的问题是,我需要在viewDidLoad之外放置dataSource(将会显示的拾取器数据)。如果满足条件,我需要viewDidLoad加载适当的数据。但是,通过与我见过的拾取器打交道的代码,dataSource数组似乎放置在viewDidLoad之外(我假定可以使用该值)。我只是想知道我是否可以将此dataSource放入viewDidLoad中,以便它可以识别它,或者是否有办法运行开关,或者在viewDidLoad外部和类中if语句。

import UIKit
import Parse
class VC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    var pickerData = [String]()
    @IBOutlet weak var namePicker: UIPickerView!
    override func viewDidLoad() {
        super.viewDidLoad()
        namePicker.dataSource = self
        namePicker.delegate = self

        //here I want the picker to show something different depending on the value of nameOfPerson. I changed the order of the array because the picker selects the first name of the array as the default. 
        switch nameOfPerson
        {
        case "Carly": 
            let pickerData = ["Carly","Jeff","Bob","Anita"]
        case "Jeff": 
            let pickerData = ["Jeff","Carly","Bob","Anita"]
        case "Bob": 
            let pickerData = ["Bob","Carly","Jeff","Anita"]
        case "Anita": 
            let pickerData = ["Anita","Carly","Jeff","Bob"]
        }
    }
   func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return pickerData.count
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return pickerData[row]
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
    }
}

我只是想知道我是否可以将此数据源放入ViewDidload中,以便它可以识别它,或者是否有办法运行开关或IF if ViewDidload外部和类别

否。数据源方法必须是方法,即在类的最高函数,以使Objective-C看到它们。因此,数据本身必须可见数据源方法,并且在viewDidLoad和数据源方法之间共享数据的唯一连贯方法是作为属性,例如您的var pickerData

您的您的代码是什么问题是let

    case "Carly": 
        let pickerData = ["Carly","Jeff","Bob","Anita"]
    case "Jeff": 
        let pickerData = ["Jeff","Carly","Bob","Anita"]
    case "Bob": 
        let pickerData = ["Bob","Carly","Jeff","Anita"]
    case "Anita": 
        let pickerData = ["Anita","Carly","Jeff","Bob"]
    }

从每种情况下删除术语let!否则,您只是设置临时的本地变量pickerData,这不是您想做的。您想设置这样声明的属性

var pickerData = [String]()

....而您的代码没有这样做!您想要的是:

case "Carly": 
    self.pickerData = ["Carly","Jeff","Bob","Anita"]
case "Jeff": 
    self.pickerData = ["Jeff","Carly","Bob","Anita"]
case "Bob": 
    self.pickerData = ["Bob","Carly","Jeff","Anita"]
case "Anita": 
    self.pickerData = ["Anita","Carly","Jeff","Bob"]
}

(当然,您需要default的情况。)

然后,在结尾处,为了安全起见,重新加载数据:

self.namePicker.reloadAllComponents()

dataSource需要在视图加载时设置数据源,尽管您可以在任何需要的地方加载它。

内部viewDidLoad

picker.datasource = self

任何地方,您都可以设置实际数据;

picker.dataArray = "example, anything"

我不确定我完全了解您。请让我知道您是否不在寻找。

最新更新