Jak ustawić maksymalną liczbę znaków w UITextField
zestawie iPhone SDK po załadowaniu UIView
?
ios
objective-c
cocoa-touch
uitextfield
Domness
źródło
źródło
Odpowiedzi:
Chociaż
UITextField
klasa nie ma właściwości maksymalnej długości, uzyskanie tej funkcji jest stosunkowo proste, ustawiając pola tekstowedelegate
i implementując następującą metodę delegowania:Cel C
Szybki
Przed zmianą pola tekstowego UITextField pyta delegata, czy określony tekst powinien zostać zmieniony. Pole tekstowe nie zmieniło się w tym momencie, więc bierzemy jego bieżącą długość i długość łańcucha, który wstawiamy (przez wklejenie skopiowanego tekstu lub wpisanie pojedynczego znaku za pomocą klawiatury), minus długość zakresu. Jeśli ta wartość jest za długa (więcej niż 25 znaków w tym przykładzie), zwróć
NO
aby zabronić zmiany.Podczas wpisywania pojedynczego znaku na końcu pola tekstowego
range.location
będzie to długość bieżącego pola irange.length
będzie wynosić 0, ponieważ niczego nie zastępujemy / nie usuwamy. Wstawienie do środka pola tekstowego oznacza po prostu innyrange.location
, a wklejenie wielu znaków oznacza po prostustring
więcej niż jeden znak.Usuwanie pojedynczych znaków lub wycinanie wielu znaków określa a
range
o niezerowej długości i pustym ciągu. Zastąpienie to tylko usunięcie zakresu niepustym ciągiem.Uwaga na temat zawieszającego się błędu „cofnij”
Jak wspomniano w komentarzach, istnieje błąd,
UITextField
który może doprowadzić do awarii.Jeśli wkleisz w polu, ale implementacja sprawdzania poprawności nie pozwala na wklejeniu, operacja wklejania jest nadal rejestrowana w buforze cofania aplikacji. Jeśli następnie zwolnić cofania (przez potrząsanie urządzeniem i potwierdzenia Cofnij), przy czym
UITextField
będzie próbował zastąpić ciąg ona myśli , że wklejony w sobie z pustym ciągiem. To się zawiesi, ponieważ nigdy tak naprawdę nie jest wkleiło łańcucha w siebie. Spróbuje zastąpić część łańcucha, która nie istnieje.Na szczęście możesz uchronić się
UITextField
przed samobójstwem w ten sposób. Musisz tylko upewnić się, że zakres, który proponuje zastąpić , istnieje w jego bieżącym ciągu. To właśnie robi powyższa wstępna kontrola poczytalności.swift 3.0 z kopiowaniem i wklejaniem działa poprawnie.
Mam nadzieję, że to ci pomoże.
źródło
return newLength <= 25;
UITextField
na iPadzie iOS 8.1. (+1 do komentarza). Czy autor dodałby coś na ten temat, ponieważ jest to najwyżej oceniana odpowiedź? Z przyjemnością dokonam edycji, ale moja regularnie wydaje się być odrzucana! :-)Szybki 4
Edycja: naprawiono problem wycieku pamięci.
źródło
Dziękuję sierpień! ( Post )
Oto kod, z którym ostatecznie skończyłem:
źródło
return textField.text.length < MAX_LENGTH || range.length != 0;
Aby uzupełnić sierpniową odpowiedź, możliwa implementacja proponowanej funkcji (patrz delegat UITextField ).
Nie testowałem kodu domeny , ale mój nie blokuje się , jeśli użytkownik osiągnął limit, i jest zgodny z nowym ciągiem, który zastępuje mniejszy lub równy.
źródło
Nie możesz tego zrobić bezpośrednio -
UITextField
nie ma atrybutu maxLength , ale możesz ustawićUITextField's
delegata, a następnie użyć:źródło
Często masz wiele pól wprowadzania o innej długości.
źródło
Najlepszym sposobem byłoby skonfigurowanie powiadomienia o zmianie tekstu. W
-awakeFromNib
metodzie kontrolera widoku będziesz chciał:Następnie w tej samej klasie dodaj:
Następnie podłącz ujście
myTextField
do swojego,UITextField
a nie pozwoli ci dodać więcej znaków po osiągnięciu limitu. Dodaj to do metody dealloc:źródło
Utworzyłem tę podklasę UITextFieldLimit:
Pobierz
UITextFieldLimit.h
iUITextFieldLimit.m
z tego repozytorium GitHub:https://github.com/JonathanGurebo/UITextFieldLimit
i zacznij testować!
Oznacz utworzony przez użytkownika scenariusz UITextField i połącz go z moją podklasą za pomocą Inspektora tożsamości:
Następnie możesz połączyć go z IBOutlet i ustawić limit (domyślnie jest to 10).
Twój plik ViewController.h powinien zawierać: (jeśli nie chcesz modyfikować ustawienia, np. Limitu)
Twój plik ViewController.m powinien
@synthesize textFieldLimit
.Ustaw limit długości tekstu w pliku ViewController.m:
Mam nadzieję, że klasa ci pomoże. Powodzenia!
źródło
To powinno wystarczyć do rozwiązania problemu (zamień 4 na żądany limit). Pamiętaj tylko, aby dodać delegata w IB.
źródło
Użyj poniższego rozszerzenia, aby ustawić maksymalną długość znaków a
UITextField
iUITextView
.Swift 4.0
UITextView
Możesz ustawić limit poniżej.
źródło
Symuluję faktyczną zamianę ciągu, która ma się wydarzyć, aby obliczyć długość przyszłego łańcucha:
źródło
Wersja Swift 3 // ***** To NIE będzie działać z Swift 2.x! ***** //
Najpierw utwórz nowy plik Swift: TextFieldMaxLength.swift, a następnie dodaj poniższy kod:
a po wybraniu dowolnego pola tekstowego zobaczysz w Storyboard nowe pole (Maksymalna długość)
jeśli nadal masz więcej pytań, sprawdź ten link: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -maksymalna długość-wizualny-styl-studio /
źródło
Za pomocą konstruktora interfejsów możesz połączyć i uzyskać zdarzenie „Edycja zmieniona” w dowolnej funkcji. Teraz możesz sprawdzić długość
źródło
Poniższy kod jest podobny do odpowiedzi sickp, ale obsługuje poprawnie operacje kopiuj-wklej. Jeśli spróbujesz wkleić tekst, który jest dłuższy niż limit, poniższy kod skróci tekst, aby dopasować go do limitu, zamiast całkowicie odmawiać operacji wklejania.
źródło
Istnieje ogólne rozwiązanie do ustawiania maksymalnej długości w Swift. Przez IBInspectable możesz dodać nowy atrybut w Inspektorze atrybutów Xcode.
źródło
Aby działało z wycinaniem i wklejaniem ciągów dowolnej długości, sugerowałbym zmianę funkcji na coś takiego:
źródło
Szybki 4
źródło
guard
?Swift 2.0 +
Przede wszystkim utwórz klasę dla tego procesu. Nazwijmy to StringValidator.swift.
Następnie wklej do niego następujący kod.
Teraz uratuj klasę .....
Stosowanie..
Teraz przejdź do klasy viewController.swift i spraw, aby ujścia twojego pola tekstowego były ...
Teraz przejdź do metody textChangeCharactersInRange pola tekstowego i użyj jej w następujący sposób.
Nie zapomnij ustawić protokołu delegowanego / metod pól tekstowych.
Pozwól mi wyjaśnić na ten temat ... Korzystam z prostego procesu rozszerzenia łańcucha napisanego wewnątrz innej klasy. Teraz po prostu wywołuję te metody rozszerzenia z innej klasy, w której ich potrzebuję, dodając check i maksymalną wartość.
Funkcje...
Rodzaje ...
zawieraOnlyCharactersIn // Akceptuje tylko znaki.
zawieraCharactersIn // Akceptuje kombinację znaków
doesNotContainsCharactersIn // Nie przyjmuje znaków
Mam nadzieję, że to pomogło .... Dzięki ..
źródło
szybki 3.0
Ten kod działa dobrze, gdy wklejasz ciąg znaków ponad limity znaków.
Dziękuję za twoje głosy. :)
źródło
Udzielam dodatkowej odpowiedzi na podstawie @Frouo. Myślę, że jego odpowiedź jest najpiękniejsza. Ponieważ jest to powszechna kontrola, której możemy użyć ponownie.
źródło
Jest to poprawny sposób obsługi maksymalnej długości na UITextField, pozwala klawiszowi powrotu na wyjście z rezygnacji z pola tekstowego jako pierwszej odpowiedzi i pozwala użytkownikowi cofnąć się, gdy osiągną limit
źródło
Co z tym prostym podejściem? Dla mnie działa dobrze.
Następnie:
źródło
Inne odpowiedzi nie obsługują przypadku, w którym użytkownik może wkleić długi ciąg ze schowka. Jeśli wkleję długi ciąg, powinien on zostać obcięty, ale pokazany. Użyj tego w swoim delegacie:
źródło
Zrobiłem to do 1 linii kodu :)
Ustaw delegata widoku tekstowego na „jaźń”, a następnie dodaj
<UITextViewDelegate>
.h i następujący kod w .m .... możesz dostosować liczbę „7”, aby była taka, jaka ma być MAKSYMALNA liczba znaków.Ten kod uwzględnia wpisywanie nowych znaków, usuwanie znaków, wybieranie znaków, a następnie pisanie lub usuwanie, wybieranie znaków i wycinanie, ogólnie wklejanie oraz wybieranie znaków i wklejanie.
Gotowy!
Alternatywnie byłby inny fajny sposób na napisanie tego kodu za pomocą operacji bitowych
źródło
Otworzyłem podklasę UITextField, STATextField , która oferuje tę funkcjonalność (i wiele więcej) dzięki swojej
maxCharacterLength
właściwości.źródło
teraz ile znaków chcesz podać wartości
źródło
Użyj tego kodu tutaj RESTRICTED_LENGTH to długość, którą chcesz ograniczyć dla pola tekstowego.
źródło
Zrobiłem to w Swift dla limitu 8 znaków, używając klawiatury numerycznej.
Musiałem przetestować ciąg! = "", Aby umożliwić działanie przycisku usuwania na klawiaturze numerycznej, w przeciwnym razie nie pozwoliłby na usuwanie znaków w polu tekstowym po osiągnięciu maksymalnego poziomu.
źródło
W przypadku Xamarin:
źródło
Zaimplementowałem rozszerzenie UITextField, aby dodać do niego właściwość maxLength.
Jest oparty na Xcode 6 IBInspectables, więc możesz ustawić limit maksymalnej długości w Konstruktorze interfejsu.
Oto implementacja:
źródło