Как сравнить значения двух разных UIPickerView?

#ios #swift #xcode #uikit

Вопрос:

У меня есть пользовательский UITableViewController с двумя пользовательскими UITableViewCell, Каждый из которых содержит UIPickerView. Я хочу сравнить значения этих UIPickerView (я создаю приложение «Карты» и хочу построить маршрут, поэтому мне нужно сравнить две точки, и если они разные, то кнопка «Создать маршрут» будет установлена в состояние Включено). Как я могу это сделать? Я попытался использовать значения didSet, но это не сработало

Вот мои занятия:

 class PlaceForRouteCell: UITableViewCell, UIPickerViewDelegate, UIPickerViewDataSource {
    
    @IBOutlet weak var picker: UIPickerView!
    
    // Выбираем все места в базе данных
    let places = realm.objects(Place.self)
    
    var selectedPlace = Place()
    
    func getSelectedPlace() -> Place {
        return selectedPlace
    }
        
    //число "барабанов"
    func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 }
    
    //число элементов в "барабане"
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        //если БД пуста, то предупредить об этом
        return places.count != 0 ? places.count : 1
    }
    
    //содержимое "барабанов"
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (places.count != 0) {
            if (places.count == 1) { return "Добавьте еще одно место" }
            return places[row].userName
        }
        return "Сохраненных мест нет"
    }
    
    //обрабатываем выбранный элемент
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if (places.count != 0) {
            print(picker.tag)
            selectedPlace = places[row]
//            print("выделена строка №(row), элемент (places[row])'")
        }
    }
    
    func setup() { picker.delegate = self }
    
    
}
 

И

 class TableForRouteViewController: UIViewController, UITableViewDataSource, UIPickerViewDelegate{
    
    // Выбираем все места в базе данных
    let places = realm.objects(Place.self)
    
    @IBOutlet weak var makeTheRouteButton: UIBarButtonItem!
    @IBOutlet var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0,
                                                         width: tableView.frame.size.width, height: 1))
        tableView.dataSource = self
        
        let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 1)) as! PlaceForRouteCell
        cell.picker.selectRow(1, inComponent: 0, animated: true)

        var cellA = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! PlaceForRouteCell {
            didSet {
                print("первая ячейка изменилось")
            }
        }
        var cellB = tableView.cellForRow(at: IndexPath(row: 0, section: 1)) as! PlaceForRouteCell

//        print("tag of A: (cellA.picker)")
//        print("tag of B: (cellB.picker.tag)")

        var valueOfA = cellA.getSelectedPlace() {
            didSet {
                print("значение в первой ячейке изменилось")
            }
        }
        print(valueOfA.userName)
        var valueOfB = cellB.getSelectedPlace() {
            didSet {
                print("значение в первой ячейке изменилось")
            }
        }
        print(valueOfB.userName)
        
        if (places.count < 2 ) { makeTheRouteButton.isEnabled = false }
    }

    @IBAction func makeTheRouteButtonPressed(_ sender: UIBarButtonItem) {
        let cellA = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! PlaceForRouteCell
        let pointA = cellA.selectedPlace
        let cellB = tableView.cellForRow(at: IndexPath(row: 0, section: 1)) as! PlaceForRouteCell
        let pointB = cellB.selectedPlace
        print("point A: (pointA.userName), point B: (pointB.userName)")
    }
    
//    var arePlacesEqual : Bool = comparing() {
//        didSet {
//            print("значения поменялись")
//        }
//    }
    
    func comparing() -> Bool {
        let cellA = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! PlaceForRouteCell
        let cellB = tableView.cellForRow(at: IndexPath(row: 0, section: 1)) as! PlaceForRouteCell
        let valueOfA = cellA.selectedPlace.userName
        let valueOfB = cellB.selectedPlace.userName
        if (valueOfA == valueOfB) { return true }
        return false
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 }
        
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "placeForRouteCell", for: indexPath) as! PlaceForRouteCell
        cell.picker.tag = indexPath[0]
        cell.setup()
        return cell
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        switch(section) {
            case 0:return "Точка А"
            case 1:return "Точка Б"
            default :return ""
        }
    }
        
    // количество секциий
    func numberOfSections(in tableView: UITableView) -> Int { return 2 }
    
}
 

Ответ №1:

Я создал tableView с помощью метода pickerView в ячейке.
В didSelectRow методе я добавил NotificationCenter отправителя
в свой класс tableViewCell:

 let picker_array = ["one", "two", "three"]

class TableViewCell: UITableViewCell, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet weak var picker: UIPickerView!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    self.picker.delegate = self
    self.picker.dataSource = self
}

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

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

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    NotificationCenter.default.post(name: Notification.Name("Notification"), object: nil)
}

}
 

В viewDidLoad я добавил NotificationCenter слушателя.
Мой класс ViewController:

 class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

let dummy_data = [1,2]

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(methodOfReceivedNotification(notification:)), name: Notification.Name("Notification"), object: nil)
}

@objc func methodOfReceivedNotification(notification: Notification) {
    for index in dummy_data {
        
        let indexPath = IndexPath(row: index - 1, section: 0)
        
        let cell = tableView.cellForRow(at: indexPath) as! TableViewCell
        
        let selectRow = picker_array[cell.picker.selectedRow(inComponent: 0)]
        
        print(selectRow)
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dummy_data.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
    
    return cell
}

}
 

Когда я изменюсь pickerView , консоль выведет текущее значение из ячеек

введите описание изображения здесь
введите описание изображения здесь

Я думаю, что это поможет

Комментарии:

1. Да, я могу проверить это, когда нажимаю на кнопку, но это не мой случай, я хочу проверять эти два средства выбора КАЖДЫЙ РАЗ, когда некоторые из них получают новое значение, Если два значения равны, то я устанавливаю свою кнопку в состояние «отключить», если они разные, то кнопка включена

2. @alexandertopskiy, я отредактировал свой ответ, пожалуйста, проверьте