Ввод данных в две текст формы, вывод результата


#1

Приветствую, уважаемые посетители данного ресурса.

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

Суть такая, в окне программы имеется 2 текст формы, либо выпадающий список и форма, и место куда выводится результат. В первую форму вносится(выбирается) число от 1 до 10, во вторую форму вносится произвольное число, и выводится результат. Результат должен высчитываться по одной формуле, но к числам от 1 до 10, нужно привязать заранее внесенные данные, которые в последствии будут использоваться в формуле.

Пример:
Выбираем 1 (в нём записаны пару чисел 100, 200, 300)
Вводим 1000 (х)
Нажимаем кнопку
Высчитывается результат на основе формулы (100+200+300)/х

Соответственно в варианте 2 свои числа, в 3 свои и т.д.

В общем прошу помощи, сложна ли задача, какие функции, какие библиотеки использовать, где можно хранить заранее внесенные данные. Спасибо.


#2

Вот не очень понятно что именно вы хотите!

Для хранения данных в вашем случае подойдет plist файл.
Тестовое поле UITextField, можете вводить что угодно. если нужен выпадающий список, ту сложнее, проще использовать tableView а в нем вывести возможные варианты.

Задача не сложная, но формулировка, лично мне не понятна, от этого и задача не понятна!


#3

вроде бы пример давольно понятный написал :))
допустим есть выпадающий список, в нем 3 варианта 1, 2, 3, к этим вариантам нужно привязать определенные числа/число, которые в дальнейшем будут использованны в формуле

Эта первая форма выбора(N):
Вариант 1 (Числа/Число)
Вариант 2 (Числа/Число)
Вариант 3 (Числа/Число)

Вторая форма для ввода любого числа, допустим она будет переменной Х

Формула рассчета результата:
Вариант(N)/X =


#4

Попробуйте пройти курсы на swiftbook. Куча вопросов по данной теме сразу отпадет.

Но если по технической части на вопрос отвечать, то никаких библиотек сторонних не нужно. Обычное приложение, на одной форме реализуете какой-нидь UIPickerView, который будет реализовывать барабан с числами, а на другой форме текстовые поля (с форматированием или без), куда вводите значения. Ну и дальше делаете расчет. Все.


#5

Почему это не сделать на одном экране - непонятно.
Проще если вы нарисуете на бумаге или в Sketch как должно выглядеть ваше приложение. И закините сюда скрины с описание функций что делать по нажатию кнопок, вводу текстовых полей итп. Тогда будет понятней.


#6

Лучше всего подойдет использование енума для связи чисел из списка. В енуме создается вычисляемое свойство, которое на основе текущего енума, выдает список чисел.

enum Number: Int {
    case one = 1, two, three;

    val numberList: (Int, Int, Int) = {
        switch self {
            case .one:
                return (100, 200, 300)
            case .two:
                return (10, 20, 30)
            case .three:
                return (1, 2, 3)
        }
    }
}

#7

Большое спасибо за то, что все помогаете. Извиняюсь, если не могу донести свой смысл до вас.

Не не не, вы правы, всё должно совершаться на одном экране конечно же.
Вот скрин как должно выглядеть :slight_smile:
Untitled-2


#8

Надеюсь что все-таки не так. :slight_smile:

Но как уже и говорил, 5 элементов на форму кидаешь:

  1. UIPickerView
  2. UITextField
  3. UIButton
  4. UILabel для текста “вывод результата”
  5. UIlabel для текста с результатом.

Все.


#9

Так, а можно ли использовать enum как предложил @RexHunt для хранения данных, чтобы они были связаны с выбором в UIPickerView? Или вообще каким способом можно воспользоваться?


#10

Можно. Почему нет? Пишешь enum, из него значения в pickerView кидаешь. Все просто.


#11

Короче, надо проходить базовый курс по свифту. Чтобы понимание было что вообще можно сделать, а что нет. А то так ты долго будешь это приложение пилить.


#12

Создаете енум. Подписываете его под протокол CaseIterable.
В PickerView все значения вставляете таким образом enum.allValues().map { $0.rawValue }
После выбора значения в PickerView получаете из него сам енум let pvValue = Enum(raw: value)
После этого уже получаете свои привязанные числа так let numbers = pvValue.numberList
И подставляете в формулу numbers.0, numbers.1, numbers.2


#13

@Tau @RexHunt спасибо вам большое, попробую


#14

@Tau @RexHunt Здравствуйте. Сделал вот такую вещь, как вывод из енума в текст поле, а как хранить данные, но чтобы их не было видно пользователю, ну и чтобы эти данные как-то можно было задействовать в формуле? Или это как-то по-другому делается? Мне допустим нужно, чтобы case one = “1” имел данные, допустим 400, и при выборе в picker эти данные брались в формулу и высчитывались. Извиняюсь заранее, если вы ничего не поняли, если не поймете, позже постараюсь пояснить.

@IBOutlet weak var titlelbl: UILabel!
@IBOutlet weak var pickerView: UIPickerView!

enum number: String, CaseIterable {
    case one = "1"
    case two = "2"
    case three = "3"
    case four = "4"
    case five = "5"
    
}

override func viewDidLoad() {
    super.viewDidLoad()
    pickerView.delegate = self
    pickerView.dataSource = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{
    return number.allCases[row].rawValue
    }
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    titlelbl.text = number.allCases[row].rawValue
}

}


#15

Через enum это сложно сделать. Можно наверное, но непонятно зачем.
Вместо enum нужна модель. В данном случае массив с набором данных. Если массив фиксированный и 100% не планируешь его обновлять, то прям в контроллере зашей. Проще будет. Если есть вероятность что массив будет изменен, то по хорошему надо добавить класс-провайдер, который будет эти данные предоставлять и как-то обрабатывать.


#16

Было бы в разы проще если бы ты свой проект на гитхаб залил. И все хотелки-сопелки реализовывал через пулл реквесты. Или хотя бы просил ветку какую-нидь глянуть и подправить. Тогда можно было бы код ревьювить и комменты писать или правки прям в проект внести и отправить пулл реквест с изменениями. Ну и ты мог бы правки вносить оперативно. Через форум это делать сложней. Обычно тут удобно спросить про какую-то мелкую функцию или технологию. А вот большие куски кода пихать, которые нельзя в тот же playground скопировать и протестить, как мне кажется не очень удобно.

ну и если с гитом не работал, вот отличный сайт, который учит в консоли основным приемам. https://learngitbranching.js.org

После этого в клиенте гитовском станет понятно откуда что растет и зачем это надо.


#17

@Tau да уж, задачка походу не так проста как изначально казалась, так то да, данные будут фиксированы при выборе определенного пункта в pickerview. По поводу гитхаба, спасибо, попробую.


#18

Задача простая. Надо просто ее продумать.


#19

А если всё таки уйти от задумки использования pickerview, и вместо него поставить простой textfield? Сделать таким образом, чтобы при вводе 0, с использованием оператора Если textfield = 0, тогда происходит расчёт формулы с использованием внесенного данного в массив на основе его индекса?
Допустим массив var numbers = [200, 300, 500, 100, 1000]
И при вводе 0, в формуле будет использоваться по индексу массива number[0] число 200?
Или это полный бред и неправильный подход?


#20

С таким подходом вам придется делать лишние проверки.
С енумом я вам дал полный пример как он должен выглядеть и как с ним работать. Это самое простое для вашего варианта.
Вы же пытаетесь уже усложнять себе работу.