我在從選取器返回值並將其與屬性值進行比較時遇到問題。基本上,我有一個Floor實體,它具有屬性「floorNumber」。從選取器中,我需要獲取樓層號並將其與正確的實體對象相匹配,以便我可以開始將房間分配到各個樓層。我已經實現了代表和數據源的選擇器,並查看了本網站上的其他問題,但我感到有點困惑。 請看我的執行情況,請告訴我我做錯了什麼。我有一個可選的「pickFloor」,即使它正在設置,它也是零,如果我嘗試打開它,它會崩潰。感謝您的幫助如何從選取器中獲取值(或索引)並將其與實體的屬性值進行比較?
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
}
}
是否有可能比Int16大?我能看到實際的錯誤嗎?在移動pickerView之前,pickFloor可能會解開這個問題。 PickerView不會在它初始化的組件上調用didSelectRow,所以如果你想要你必須手動初始化pickFloor到pickerView啓動的同一個位置。 – Sethmr
在setTheFloors方法檢查等同性時,pickFloor的錯誤是「意外發現零,而解包值」。如果我拿!那麼代碼塊不會被執行。如果我放!然後錯誤。它沒有被分配所選項目或索引的值。當我測試它時,我已經移動了選擇器,並且發生了同樣的事情。我將如何將選定的行值或索引分配給拾取的變量?謝謝 –
在didSelectRow裏面,在做其他行之前先打印convertedFloorValues,然後看看它說了什麼。 – Sethmr