Использование двух PickerView на одном VC


#1

Ребят, подскажите, сам что-то ничего толкового не нарыл.
На VC есть два PickerView (нужно два разных массива данных иметь, вариант с одним пикером, но двумя барабанами не подходит, так как в барабанах, не должны повторяться данные(если это можно как-то разделить в рамках одного PV, прошу подсказать)).
Задал два массива, два оутлета, при описании фукций Pickera, в оба барабана на вьюхе пишет значения одного пикера.
Как разделить функции для работы на два пикера ?
И как потом вытаскивать данные из пикеров ?

Спасибо !


#2

Посмотрите этот пример:


#3

зачем два пикера, если они оба делают одно и тоже.
хватит и одного. при клике на то или иное поле, просто передаете свой набор данных и начальное значение.


#4

Концепция ясна… Слушать конечно было сложно.(
На видео реализована схема, в которой выбор PickerView меняется в зависимости от выбранного TextField.
В моем случае TextField нет. Данные из PickerView будут просто вставляться в переменную, которая в дальнейшем будет использоваться другими функциями.
Как в этом случае мне определять, какой массив возвращать ?


#5

т.е. если задать два барабана, то я могу для каждого выводить свой набор данных ?
это отличный вариант, но я пока не пойму, как тогда разделить мне вывод…


#6

создайте переменную, которая будет отслеживать текущий барабан.
к приеру var pickerMode: Int = 0
при вызове первого барабана, ставите переменную 1, при вызове второго 2.
после выбора значения из любого из барабанов, будете смотреть на эту переменную и в зависимости от значения, запишите в нужный массив выбранное значение.
В андроиде это уже из коробки есть, передается ключ с командой, по которому потом проверяется какой процесс был сделан.


#7

С тем как сделать два массива данных в одном пикере разобрался, спасибо !
Но тут возник еще один вопрос.
В зависимости от времени (например с 10:00 МСК - при выборе в первом барабане 1 значения - какая-нибудь переменная принимает значение Х, а с 12:00 - при выборе этого же значение - переменная принимает значение Y) как это можно реализовать ?

Добавить третий барабан, в котором жестко привязать временные интервалы и в зависимости от выбранных параметров передавать значение в переменную ?
Или можно как-то еще сделать ?


#8

Все верно мыслите. Мне пока добавить нечего.


#9

Мысли мыслями… Но я никак не могу понять, как мне это сделать.
Отображение в барабане трех столбцов я сделал.
А как сделать так, чтобы присваивались нужные значения при выборе комбинации в барабанах…
Через didSelectRow, как это делается для одного отдельного пикера я не пойму как это реализовать…
switch 0: - это же выбор просто нулевого элемента в пикере с одним столбцом, а как эту штуку настроить так чтобы: stitch 0 - перебор трех барабанов… Не пойму, помогите…((

Спасибо !


#10

Вот кусок кода:

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 3
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if (component == 0) {
        return listService.count
    } else if (component == 1) {
        return listProject.count
            }
            else {
                return timeMSK.count
            }
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{
    if (component == 0) {
        return listService[row]
    } else if (component == 1) {
        return listProject[row]
    }
            else {
                return timeMSK[row]
    }
    
}

Как например присвоить переменной X значение Y, если в пикере на первом барабане выбрано 1, на втором 0, а на третьем 3 ??
Никак не соображу. Простите 3 недели как программист (ну 10 лет назад я конечно что-то писал в универе, но то было давно и не правда)))


#11

Вот здесь посмотрите:


#12

На этапе словаря застрял… не смог создать переменную и присвоить ей значение
Dictionary <String, Dictionary<String,Dictionary<String,String>>> = Dictionary()

Ну и соответственно дальше я тоже не разобрался уже ((


#13

Ну вам нужно создать механизм проверки и карту сопоставления выбранных значений.
Я бы рекомендовал делать обычный массив строк, в котором каждый элемент, это будет набор из 3х барабанов, разделенный к примеру точкой с запятой. Пример
let map = [“1;5;10”, “3;0;7”, “0;12;4”, …]
Для проверки выбираете все выбранные значения из всех барабанов, собираете их в строку, разделяя отдельные значения точкой с запятой, а потом просто ищите в массиве с картой.
Таким образом для различного времени создаете 2 карты и для проверки подставляете нужную по времени.


#14

Еху… Нашел пушка-гонка то что надо метод…

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    
    let service = listService[pickerView.selectedRow(inComponent: 0)]
    let project = listProject[pickerView.selectedRow(inComponent: 1)]
    let time = timeMSK[pickerView.selectedRow(inComponent: 2)]
    
    labelView.text = ("Wuuusup \(service) Vasya \(project) !! \(time)")
}

В результате в labelView.text пишется выбранные в пикере параметры.
Соответственно осталось придумать сравнение типа если (service) (project) (time) == lalala, то X = Y
Правильно ? Или что-то путаю… Не варит котел уже к вечеру совсем (


#15

Да, все верно. Разделитель можете выбирать какой вам удобнее.


#16

Простите, не понял как вы предлагали сделать… наг0внокодил скорее всего, просто циклом перебрал все необходимые мне варианты, благо их было всего 21 =)))))
Я обязательно научусь делать это более красиво… Но пока так сойдет. Это же первое приложение, которое я вообще на этом языке делаю не по курсам… А из голови собираю из того что есть )) Мне кажется уже начал понимать индийский, немецкий и еще какие-то языки, какие только встречались на yuotubeщ ))
Главное оно работает, и в переменную вставляет нужные данные в зависимости от комбинации на барабанах !
Спасибо за помощь, Ребят !

Если что, вот на этом видео самый доступный, на мой взгляд, пример был MultyPickerView