Как использовать несколько UIPickerViews в одном контроллере представления - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь настроить 2 UIPickerViews в 1 контроллере представления.Мне не удалось найти ресурсы, которые решают мою проблему.

Я пытался следовать ответу от Diavel Rider на Как использовать 2 UIPickerView в одном View Controller? .Я получил некоторые ошибки от этого.Я также попытался добавить теги, но не смог успешно сделать это.Я использую Swift 4.

Вот код моего контроллера представления:

import UIKit

class FirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ foodTypeUIPickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        var countrows : Int = nutritionPickerData.count
        if pickerView == foodTypeUIPickerView { **[Error Here: "Binary operator '==' cannot be applied to operands of type '_' and 'UIPickerView'"]**
            countrows = self.foodTypePickerData.count
        }
        return countrows
    }

    func pickerView(_ foodTypeUIPickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == nutritionUIPickerView { **[Error Here: "Binary operator '==' cannot be applied to operands of type '_' and 'UIPickerView'"]**
            let titleRow = nutritionPickerData[row]
            return titleRow
        } else if pickerView == foodTypeUIPickerView { **[Error Here: "Binary operator '==' cannot be applied to operands of type '_' and 'UIPickerView'"]**
            let titleRow = foodTypePickerData[row]
            return titleRow
        }

        return ""

    }

    @IBOutlet weak var nutritionUIPickerView: UIPickerView!

    @IBOutlet weak var foodTypeUIPickerView: UIPickerView!

    var nutritionPickerData = ["Protein", "Fiber", "Iron", "Fat", "Sodium", "Calcium/Vitamin D", "Energy", "Carbohydrates", "Cholestorol"]
    var foodTypePickerData = ["Fruits", "Vegetables", "Legumes and Beans", "Grain", "Meat", "Dairy"]

    @IBAction func submitUIButton(_ sender: Any) {
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.nutritionUIPickerView.delegate = self
        self.nutritionUIPickerView.dataSource = self

        self.foodTypeUIPickerView.delegate = self
        self.foodTypeUIPickerView.dataSource = self

    }


}

Мне нужно использовать 2 представления выбора в 1 контроллере представления.Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Вы ссылаетесь на несуществующую переменную с именем pickerView.Чтобы избежать проблем, необходимо изменить имя параметра на pickerView.

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerView == foodTypeUIPickerView {
        return self.foodTypePickerData.count
    } else {
        return self. nutritionPickerData.count
    }
}

Внести аналогичные изменения в другие методы делегата / источника данных.

0 голосов
/ 05 апреля 2019

Вы должны отделить свои источники данных и делегатов, а не помещать их в свой контроллер представления. Установите их в качестве делегата и источника данных. Код написан на swift 4.2 xcode 10.1

class ViewController: UIViewController {

    @IBOutlet weak var foodPicker: UIPickerView!
    @IBOutlet weak var nutritionPicker: UIPickerView!

    var foodData = FoodData()
    var nutritionData = NutritionData()


    override func viewDidLoad() {
        super.viewDidLoad()

        foodPicker.delegate = foodData
        foodPicker.dataSource = foodData

        nutritionPicker.delegate = nutritionData
        nutritionPicker.dataSource = nutritionData
    }

    @IBAction func actionButton(_ sender: UIButton) {

        let food = foodPicker.delegate?.pickerView!(foodPicker, titleForRow: foodPicker.selectedRow(inComponent: 0), forComponent: 0)

        let nutrition = nutritionPicker.delegate?.pickerView!(nutritionPicker, titleForRow: nutritionPicker.selectedRow(inComponent: 0), forComponent: 0)

        print("You picked: \(food) and \(nutrition)")
    }    
}

class FoodData: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
    var foodTypePickerData = ["Fruits", "Vegetables", "Legumes and Beans", "Grain", "Meat", "Dairy"]

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return foodTypePickerData.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return foodTypePickerData[row]
    }
}

class NutritionData: NSObject, UIPickerViewDataSource, UIPickerViewDelegate {
    var nutritionPickerData = ["Protein", "Fiber", "Iron", "Fat", "Sodium", "Calcium/Vitamin D", "Energy", "Carbohydrates", "Cholestorol"]

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return nutritionPickerData.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return nutritionPickerData[row]
    }
}
...