如何从选择器中获取值(或索引)并将其与实体属性的值进行比较?

时间:2017-03-24 13:08:43

标签: swift core-data swift3

我在从选择器返回值并将其与属性值进行比较时遇到问题。基本上,我有一个Floor实体,它有一个属性“floorNumber”。从选择器我需要得到楼层号码并将其与正确的实体对象匹配,这样我就可以开始为各个楼层分配房间。我已经为选择器实现了委托和数据源,并查看了该网站上的其他问题,但我有点困惑。 请看看我的实施情况,请告诉我我做错了什么。我有一个可选的“pickedFloor”即使它被设置也是零,如果我试图打开它会崩溃它。谢谢你的帮助

class SetNumberOfRoomsPerFloor: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    //MARK: - Properties

    @IBOutlet private weak var floorPicker: UIPickerView!

    @IBOutlet private weak var numberOfRoomsPerFloor: UITextField!

    private var managedObjectContext: NSManagedObjectContext!

    internal var floorValue: Int16?

    private var convertedFloorValues = [String]()

    private var storedFloors = [Floors]()

    private var pickedFloor: Int16?

    private var roomNumberValue: Int16 {
        get {
            return Int16(numberOfRoomsPerFloor.text!)!
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        floorPicker.delegate = self
        floorPicker.dataSource = self
        loadFloorData()
        spinnerItems()
    }

    @IBAction func setTheFloors(_ sender: UIButton) {
        if storedFloors.count > 0 {
            if storedFloors.first?.floorNumber == pickedFloor {
                storedFloors.first?.numberOfRooms = roomNumberValue
                print("\(storedFloors.first?.floorNumber) + \(storedFloors.first?.numberOfRooms)")
            }
        }
    }

    @IBAction func nextStep(_ sender: UIButton) {}

    private func loadFloorData() {
        let floorRequest: NSFetchRequest<Floors> = Floors.fetchRequest()
        do {
            storedFloors = try managedObjectContext.fetch(floorRequest)
        } catch {
            print("could not load data from core \(error.localizedDescription)")
        }
    }

    private func spinnerItems() {
        for i in 0...floorValue! - 1 {
            convertedFloorValues.append(String(i))
        }
    }

    public func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return convertedFloorValues.count
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return convertedFloorValues[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let selection = Int16(convertedFloorValues[row]) // not sure I have to do this part.
        pickedFloor = selection
    }
}

2 个答案:

答案 0 :(得分:1)

如果用户未在pickerview中选择任何内容,则pickedFloor将为nil。请尝试此操作。

@IBAction func setTheFloors(_ sender: UIButton) {
    if storedFloors.count > 0 {
        if storedFloors.first?.floorNumber == convertedFloorValues[floorPicker.selectedRow(inComponent: 0)] {
            storedFloors.first?.numberOfRooms = roomNumberValue
            print("\(storedFloors.first?.floorNumber) + \(storedFloors.first?.numberOfRooms)")
        }
    }
}

答案 1 :(得分:1)

在此功能中,你应该这样做

private func spinnerItems() {
    for i in 0...floorValue! - 1 {
        convertedFloorValues.append(String(i))
    }
    if convertedFloorValues.count >= 1 {
        pickedFloor = Int16(convertedFloorValues[0])
    }
}

就像我在评论中所说的那样,如果你实际上没有移动选择器视图,那么didSelectRow永远不会被调用。