2016-08-23 9 views
5

Wieczór, w mojej aplikacji mam kilka UITextfield. Każdy z nich musi potwierdzić różne ograniczenia w różnych.Swift3: najlepszy sposób sprawdzania poprawności tekstu wprowadzonego przez użytkownika w UITextField

Na przykład, mam pole daty, kod pocztowy Field SSN pole itd

z Apple dokumentacji znalazłem:

przypisać obiektu delegowanego do obsługi ważnych zadań, takich jak:

  • Określanie, czy użytkownik powinien mieć możliwość edytowania zawartości pola tekstowego.

  • Sprawdzanie poprawności tekstu wprowadzonego przez użytkownika.

  • Odpowiadanie na krany w przycisku powrotu klawiatury.

  • Przekazywanie wprowadzonego przez użytkownika tekstu do innych części aplikacji.

  • Zapisz odniesienie do pola tekstowego w jednym z obiektów kontrolera.

Więc jestem całkiem pewny, że muszę używać delegatów i func textFieldDidEndEditing(_:).

Jedynym sposobem, który przyszedł mi do głowy jest użycie switch oświadczenie wewnątrz func textFieldDidEndEditing(_:) aby potwierdzić przekazać ograniczenia różnicy.

Czy istnieje lepszy, bezpieczniejszy i szybszy wzór rozwiązania tego problemu?

+1

Myślę, że sposób na przejście tutaj, na przykład, jest rozróżnieniem między tagami pól tekstowych. – Maurice

+0

@MauriceA. Dziękuję, dokładnie o tym myślałem, zobaczmy, czy ktoś może dać nam inny wzór. :) –

Odpowiedz

1

można ustawić unikalny tag na każdym swoim polu tekstowym i można porównać w textFieldDidEndEditing lub można wziąć IBOutlet każdego textField i można porównać go textFieldDidEndEditing podobnego,

func textFieldDidEndEditing(textField: UITextField) { 

    // By tag 
    if textField.tag == 100 { 

    } 

    // OR 

    //by outlet 
    if textField == self.myTextField { 


    } 
} 
+0

Dziękuję Ketan, nie wiedziałem o znacznikach! –

+0

Nie ma za co ... :) – Lion

+0

Tagi nie są dobre, rozwiązanie Annie Dev jest lepsze. –

1

masz rację, trzeba będzie sprawdzić pole tekstowe, albo można sprawdzić tagów przypisanych do poszczególnych pól tekstowych za pomocą instrukcji switch jak mówiłeś, czy można porównać pól tekstowych się,

jeśli Pole tekstowe 1, Pole tekstowe 2 są wyloty do dwóch pól tekstowych, można porównać, jak następuje,

func textFieldDidEndEditing(textField: UITextField) 
{ 
    if textField == textfield1 
    { 

    } 
    else if textField == textfield2 
    { 

    } 
} 
+0

Dziękujemy! Pójdę po to rozwiązanie niż. –

1

można utworzyć enum walidacji

enum Type { 
    case zipcode 
    case number 
} 

następnie można utworzyć metodę weryfikacji takiego:

func isValidate(text: String, type: Type) -> Bool { 
    switch type { 
    case .zipcode: 
     ... 
    } 
} 

metoda ta może być w klasie Util. to najlepsza praktyka. ponieważ twoja logika jest hermetyzowana z zewnątrz.

+0

Dziękuję, Farhad, ale już zadeklarowane zbytu, myślę, że to szybciej z nich korzystać, niż tworzenie nowego wyliczenia. –

1

Jeśli potrzebujesz większej kontroli nad tekstem, który jest zaangażowany w polu tekstowym lub jeśli chcesz przekazać opinię gdy pole tekstowe jest edytowany, należy zastosować inną delegata Zamiast:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    // Build and check the new text value. Accept or reject the change. 
} 

W delegacie można zbudować nową wartość text. Potwierdź to, zastosuj ograniczenia, zdecyduj, które informacje zwrotne powinien otrzymać użytkownik ("Twoje hasło musi składać się z co najmniej ośmiu znaków", "To nie jest prawidłowy numer IBAN"), zaakceptuj lub odrzuć zmianę (tj. Zwróć false).

Należy pamiętać, że delegat to , a nie, który jest wywoływany, jeśli właściwość zostanie przypisana ręcznie do właściwości text. Co więcej, ten uczestnik jest wywoływany, gdy tekst jest wklejany lub usuwany z pola tekstowego, co może sprawić, że sprawy będą znacznie bardziej skomplikowane w zależności od tego, co robisz.

Powiązane problemy