2017-03-24 38 views
0

我在從選取器返回值並將其與屬性值進行比較時遇到問題。基本上,我有一個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 
    } 
} 
+0

是否有可能比Int16大?我能看到實際的錯誤嗎?在移動pickerView之前,pickFloor可能會解開這個問題。 PickerView不會在它初始化的組件上調用didSelectRow,所以如果你想要你必須手動初始化pickFloor到pickerView啓動的同一個位置。 – Sethmr

+0

在setTheFloors方法檢查等同性時,pickFloor的錯誤是「意外發現零,而解包值」。如果我拿!那麼代碼塊不會被執行。如果我放!然後錯誤。它沒有被分配所選項目或索引的值。當我測試它時,我已經移動了選擇器,並且發生了同樣的事情。我將如何將選定的行值或索引分配給拾取的變量?謝謝 –

+0

在didSelectRow裏面,在做其他行之前先打印convertedFloorValues,然後看看它說了什麼。 – Sethmr

回答

1

在這個函數中,你應該就像我說的意見,didSelectRow從來沒有得到,如果你不實際移動選擇器視圖稱爲爲此

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

+0

好吧,明白了。說得通。非常感謝你。您是否確認,假設用戶爲所有樓層設置了房間,函數實現週期是通過Floor類型的所有實體對象還是僅僅是第一個?謝謝 –

+0

我無法理解這個問題。我也很困惑,爲什麼你將一個字符串轉換爲int16。 – Sethmr

+0

對不起,我指的是setTheFloors函數。謝謝 –

1

如果pickerview然後pickedFloor用戶沒有選擇任何內容將是nil.Try這一點。

@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)") 
     } 
    } 
} 
+0

謝謝你的回答。我也有一些困惑,也許你可以幫助我。假設用戶爲所有樓層設置房間,那麼函數實現將循環所有Floor類型的實體對象還是第一個?謝謝 –

+0

如果我實現你的解決方案,我還需要didSelectRow函數嗎? –

+0

不可以。您不需要函數和變量'pickedFloor'。 –

相關問題