Създаването на UITextField за обработка на въвеждане на валута може да изглежда достатъчно лесно, докато всъщност не започнете да пишете кода. Първият проблем, който вероятно ще срещнете, е как ще ограничите потребителя да въвежда нещо различно от числа. Тогава може да разберете, че принуждаването на потребителите да въвеждат точки и запетаи не е най-доброто потребителско изживяване. Ето някои допълнителни проблеми, с които ще се сблъскате:
- Не всички региони и държави имат своя валутен символ отляво, както в Съединените щати.
- Някои региони и държави променят поставянето на запетаи и точки.
- Някои валути са форматирани като цели числа вместо два знака след десетичната запетая (т.е. японски йени JPY).
- Ако искате да запазите въведената валута във вашата база данни като число (Double, Float и т.н.), ще „почистите“ валутния низ, така че приложението ви да не се срине, когато се опитате да използвате сумата в изчисление.
Към момента на писане, Swift има 903 кодови комбинации за локал и валута, от които да избирате. Можете да извлечете всичко това, като преминете през Locale.availableIdentifiers
.
Както споменах в началото, има повече неща, които трябва да имате предвид, отколкото първоначално се смяташе.
Да започваме
Моля, обърнете внимание — тази статия няма за цел да ви научи на всичко, което трябва да знаете за работата с валути в Swift. Надявам се, че ще видите моя подклас UITextField и ще можете да излезете с някои свои заключения. С това казано, да тръгваме.
До края на тази статия ето какво ще създаде вашето текстово поле:
Както можете да видите, въвеждането на „1“ в текстовото поле ще бъде форматирано като „$0,01“, въвеждането на „2“ ще бъде форматирано като „$0,12“ и т.н. Според мен това е най-доброто потребителско изживяване. По този начин потребителят не трябва да се притеснява да въведе символа на валутата, да се увери, че има точка на правилното място и т.н. Всичко, което трябва да направи, е да въведе числата.
Знам, че това е много за разбиране. Няма да обяснявам всеки ред код, но ще се опитам да обясня ключовите съставки. За да видите съдържанието на типа Валута, моля, вижте целия проект в Github.
- Това затваряне/обратно извикване ще предава форматирания валутен низ и „чистата“ числова сума към вашия UIViewController, ViewModel и т.н. всеки път, когато потребителят промени съдържанието на textField.
- Когато създавате екземпляр на CurrencyTextField във вашия UIViewController, ще искате да предадете екземпляр на валута, така че текстовото поле да има локал, валутен код и т.н.
- Тук е инструментът за форматиране на числа на CurrencyTextField, маркиран като частен, тъй като само този клас се нуждае от достъп до него.
- Помните ли как казах, че някои валути са форматирани като цели числа (т.е. JPY)? Изчисленото свойство ще върне 2 или 0 в зависимост от заявената валута. Това също е ключова част от това текстово поле, защото определя дали въведената сума трябва да бъде разделена на 100.
- Това частно свойство подпомага метода на делегат
shouldChangeCharactersIn range
при определяне дали символът на валутата е отдясно или отляво. Това е ключово, когато потребителят натисне бутона за изтриване и валутата е отдясно. - Този метод настройва текстовото поле, включително настройване на типа клавиатура на цифрова клавиатура. Това ограничава потребителя да въвежда букви вместо цифри.
- Този метод се извиква всеки път, когато употреба променя съдържанието на текстовото поле. Този метод преминава през символите на въведения низ и премахва всички знаци, които не са числови. След като въведената сума бъде „почистена“, класът определя дали валутата е форматирана като цяло число (т.е. JPY) или с два знака след десетичната запетая (т.е. USD). След това както сумата на форматирания низ, така и изчистената стойност се предават обратно към ViewController чрез обратното извикване
passTextFieldText
. - Намерих този метод в Stack Overflow, за да гарантирам, че курсорът винаги започва най-вдясно на текстовото поле и деактивира възможността да го местите.
- Не на последно място, този метод на делегиране на UITextField открива единичния знак, въведен от потребителя, както и низа, който е бил в текстовото поле преди промяната. Използвам този метод, за да определя дали потребителят е натиснал бутона за връщане назад и дали символът на валутата е от дясната страна на текста на текстовото поле.
Добавяне към ViewController
Ето основна реализация за това как да го добавите към UIViewController. Забележка — няма нужда да се съобразявате с методите на протокола UITextFieldDelegate. Цялата логика се съдържа в персонализирания подклас UITextField. Страхотното в това е, че форматираната сума на низа и изчистената сума Double се предават обратно в passTextFieldText
обратното извикване.
Забележка - можете също да използвате това, ако използвате Storyboards.
Увийте
Ако сте работили с форматиране на валута в миналото, надявам се, че можете да оцените простотата на този подход. Целта ми беше да направя това възможно най-ясно и да не ставам твърде технически.
Чувствайте се свободни да получите целия „проект“ от GitHub. Този проект също ще ви помогне да видите как другите валути са форматирани в техния специфичен локал.