W przypadku Swift 5 i iOS 12 wypróbuj następującą implementację textField(_:shouldChangeCharactersIn:replacementString:)
metody, która jest częścią UITextFieldDelegate
protokołu:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
- Najważniejszą częścią tego kodu jest konwersja z
range
( NSRange
) na rangeOfTextToReplace
( Range<String.Index>
). Obejrzyj ten samouczek wideo, aby zrozumieć, dlaczego ta konwersja jest ważna.
- Aby to działało poprawnie kod, należy również ustawić
textField
„s smartInsertDeleteType
wartości UITextSmartInsertDeleteType.no
. Zapobiegnie to ewentualnemu wstawieniu (niechcianej) dodatkowej przestrzeni podczas wykonywania operacji wklejania.
Pełny przykładowy kod poniżej pokazuje, jak zaimplementować textField(_:shouldChangeCharactersIn:replacementString:)
w UIViewController
:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard
override func viewDidLoad() {
super.viewDidLoad()
textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
textField.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
}
text.characters.count
jest przestarzałetext.count
Robię to tak:
Kod działa dla mnie. Ale pracuję z storyboardem. W Storyboard dodaję akcję dla pola tekstowego w kontrolerze widoku przy zmianie edycji .
źródło
Aktualizacja dla Swift 4
źródło
Dodaj więcej szczegółów z odpowiedzi @Martin
źródło
W Swift 4
Ograniczenie do 10 znaków dla pola tekstowego i zezwolenie na usuwanie (backspace)
źródło
mała zmiana dla IOS 9
źródło
Szybki 3
źródło
możesz rozszerzyć UITextField i dodać plik
@IBInspectable
obiekt do obsługi tego:SWIFT 5
a następnie zdefiniuj go w inspektorze atrybutów
Zobacz oryginalną odpowiedź Swift 4
źródło
Jeśli chcesz nadpisać ostatnią literę:
źródło
Opublikowałem rozwiązanie za pomocą
IBInspectable
, więc możesz zmienić wartość maksymalnej długości zarówno w kreatorze interfejsu, jak i programowo. Sprawdź to tutajźródło
Możesz użyć w Swift 5 lub Swift 4, jak obraz wygląda jak poniżej
dodaj kod w widoku ViewController
Możesz pobrać pełne źródło z GitHub: https://github.com/enamul95/TextFieldMaxLen
źródło
Uważaj na błąd cofania UITextField wspomniany w tym poście: Ustaw maksymalną długość znaków w UITextField
oto, jak szybko to naprawić
źródło
źródło
Używałem tego protokołu / rozszerzenia w jednej z moich aplikacji i jest trochę bardziej czytelny. Podoba mi się, jak rozpoznaje backspace i wyraźnie mówi ci, kiedy znak jest backspace.
Kilka kwestii do rozważenia:
Cokolwiek implementuje to rozszerzenie protokołu, musi określić limit znaków.Zwykle będzie to Twój ViewController, ale możesz zaimplementować limit znaków jako właściwość obliczoną i zwrócić coś innego, na przykład limit znaków w jednym z modeli.
2. Będziesz musiał wywołać tę metodę wewnątrz metody delegata shouldChangeCharactersInRange pola tekstowego. W przeciwnym razie nie będziesz w stanie zablokować wprowadzania tekstu, zwracając fałsz itp.
3. Prawdopodobnie będziesz chciał przepuścić znaki Backspace. Dlatego dodałem dodatkową funkcję do wykrywania backspace. Twoja metoda shouldChangeCharacters może to sprawdzić i wcześnie zwrócić wartość „true”, więc zawsze zezwalasz na cofanie.
Jeśli ktoś z was jest zainteresowany, mam repozytorium Github, w którym wykorzystałem niektóre z tego zachowania limitu znaków i umieściłem w strukturze iOS. Istnieje protokół, który możesz zaimplementować, aby uzyskać wyświetlacz limitu znaków podobny do Twittera, który pokazuje, jak daleko przekroczyłeś limit znaków.
CharacterLimited Framework w serwisie Github
źródło
Ponieważ delegaci są relacją 1 do 1 i mógłbym chcieć użyć go gdzie indziej z innych powodów, chciałbym ograniczyć długość pola tekstowego, dodając ten kod w ich konfiguracji:
źródło
Używam tego;
Limit 3 znaków
źródło
Szybki 5
źródło
Musisz sprawdzić, czy istniejący ciąg plus dane wejściowe jest większy niż 10.
źródło