Създаването на UITextField за обработка на въвеждане на валута може да изглежда достатъчно лесно, докато всъщност не започнете да пишете кода. Първият проблем, който вероятно ще срещнете, е как ще ограничите потребителя да въвежда нещо различно от числа. Тогава може да разберете, че принуждаването на потребителите да въвеждат точки и запетаи не е най-доброто потребителско изживяване. Ето някои допълнителни проблеми, с които ще се сблъскате:

  • Не всички региони и държави имат своя валутен символ отляво, както в Съединените щати.
  • Някои региони и държави променят поставянето на запетаи и точки.
  • Някои валути са форматирани като цели числа вместо два знака след десетичната запетая (т.е. японски йени JPY).
  • Ако искате да запазите въведената валута във вашата база данни като число (Double, Float и т.н.), ще „почистите“ валутния низ, така че приложението ви да не се срине, когато се опитате да използвате сумата в изчисление.

Към момента на писане, Swift има 903 кодови комбинации за локал и валута, от които да избирате. Можете да извлечете всичко това, като преминете през Locale.availableIdentifiers.

Както споменах в началото, има повече неща, които трябва да имате предвид, отколкото първоначално се смяташе.

Да започваме

Моля, обърнете внимание — тази статия няма за цел да ви научи на всичко, което трябва да знаете за работата с валути в Swift. Надявам се, че ще видите моя подклас UITextField и ще можете да излезете с някои свои заключения. С това казано, да тръгваме.

До края на тази статия ето какво ще създаде вашето текстово поле:

Както можете да видите, въвеждането на „1“ в текстовото поле ще бъде форматирано като „$0,01“, въвеждането на „2“ ще бъде форматирано като „$0,12“ и т.н. Според мен това е най-доброто потребителско изживяване. По този начин потребителят не трябва да се притеснява да въведе символа на валутата, да се увери, че има точка на правилното място и т.н. Всичко, което трябва да направи, е да въведе числата.

Знам, че това е много за разбиране. Няма да обяснявам всеки ред код, но ще се опитам да обясня ключовите съставки. За да видите съдържанието на типа Валута, моля, вижте целия проект в Github.

  1. Това затваряне/обратно извикване ще предава форматирания валутен низ и „чистата“ числова сума към вашия UIViewController, ViewModel и т.н. всеки път, когато потребителят промени съдържанието на textField.
  2. Когато създавате екземпляр на CurrencyTextField във вашия UIViewController, ще искате да предадете екземпляр на валута, така че текстовото поле да има локал, валутен код и т.н.
  3. Тук е инструментът за форматиране на числа на CurrencyTextField, маркиран като частен, тъй като само този клас се нуждае от достъп до него.
  4. Помните ли как казах, че някои валути са форматирани като цели числа (т.е. JPY)? Изчисленото свойство ще върне 2 или 0 в зависимост от заявената валута. Това също е ключова част от това текстово поле, защото определя дали въведената сума трябва да бъде разделена на 100.
  5. Това частно свойство подпомага метода на делегат shouldChangeCharactersIn range при определяне дали символът на валутата е отдясно или отляво. Това е ключово, когато потребителят натисне бутона за изтриване и валутата е отдясно.
  6. Този метод настройва текстовото поле, включително настройване на типа клавиатура на цифрова клавиатура. Това ограничава потребителя да въвежда букви вместо цифри.
  7. Този метод се извиква всеки път, когато употреба променя съдържанието на текстовото поле. Този метод преминава през символите на въведения низ и премахва всички знаци, които не са числови. След като въведената сума бъде „почистена“, класът определя дали валутата е форматирана като цяло число (т.е. JPY) или с два знака след десетичната запетая (т.е. USD). След това както сумата на форматирания низ, така и изчистената стойност се предават обратно към ViewController чрез обратното извикване passTextFieldText.
  8. Намерих този метод в Stack Overflow, за да гарантирам, че курсорът винаги започва най-вдясно на текстовото поле и деактивира възможността да го местите.
  9. Не на последно място, този метод на делегиране на UITextField открива единичния знак, въведен от потребителя, както и низа, който е бил в текстовото поле преди промяната. Използвам този метод, за да определя дали потребителят е натиснал бутона за връщане назад и дали символът на валутата е от дясната страна на текста на текстовото поле.

Добавяне към ViewController

Ето основна реализация за това как да го добавите към UIViewController. Забележка — няма нужда да се съобразявате с методите на протокола UITextFieldDelegate. Цялата логика се съдържа в персонализирания подклас UITextField. Страхотното в това е, че форматираната сума на низа и изчистената сума Double се предават обратно в passTextFieldText обратното извикване.

Забележка - можете също да използвате това, ако използвате Storyboards.

Увийте

Ако сте работили с форматиране на валута в миналото, надявам се, че можете да оцените простотата на този подход. Целта ми беше да направя това възможно най-ясно и да не ставам твърде технически.

Чувствайте се свободни да получите целия „проект“ от GitHub. Този проект също ще ви помогне да видите как другите валути са форматирани в техния специфичен локал.