Robię, UITextField
że ma UIPickerView
as inputView
. Wszystko jest w porządku, poza tym, że mogę edytować przez kopiowanie, wklejanie, wycinanie i zaznaczanie tekstu, a tego nie chcę. Tylko Picker powinien modyfikować pole tekstowe.
Nauczyłem się, że mogę wyłączyć edycji poprzez ustawienie setEnabled
lub setUserInteractionEnabled
do NO
. Ok, ale TextField przestaje reagować na dotyk, a selektor nie pojawia się.
Co mogę zrobić, żeby to osiągnąć?
ios
uitextfield
uipickerview
Luiz de Prá
źródło
źródło
Przetłumacz odpowiedź Nicka na szybki:
P / S: Return false => pola tekstowe nie mogą być wprowadzane, edytuj za pomocą klawiatury. Po prostu może ustawić tekst za pomocą kodu.EX: textField.text = "Mój ciąg tutaj"
źródło
To byłoby najprostsze ze wszystkich:
in viewDidLoad: (ustaw delegata tylko dla pól tekstowych, które nie powinny być edytowalne.
i wstaw tę funkcję delegata:
Otóż to!
źródło
UIPickerView
zachowanie z tej metody delegata, działa dobrze.W Swift 3+:
źródło
Byłoby bardziej eleganckie utworzenie niestandardowej podklasy
UITextField
zwracającejNO
wszystkie wywołania docanPerformAction:withSender:
(lub przynajmniej gdzieaction
jest@selector(cut)
lub@selector(paste)
), jak opisano tutaj .Ponadto zaimplementowałbym również ciąg - (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range replaceString: (NSString *) ciąg zgodnie z sugestią Nicka, aby wyłączyć wprowadzanie tekstu z klawiatur Bluetooth.
źródło
canPerformAction
ishouldChangeCharactersInRange
metody nigdy nie są wywoływane.Po prostu umieść przycisk UIButton dokładnie nad całym UITextField bez tekstu etykiety, co czyni go „niewidocznym”. Ten przycisk może odbierać i delegować dotknięcia zamiast pola tekstowego, a zawartość pola tekstowego jest nadal widoczna.
źródło
W Swift:
źródło
Skorzystałem z rozwiązania dostarczonego przez MrMage. Jedyne, co chciałbym dodać, to zrezygnować z UITextView jako pierwsza osoba odpowiadająca, w przeciwnym razie utkniesz z zaznaczonym tekstem.
Oto mój szybki kod:
źródło
Aby uzyskać alternatywę, która obsługuje UIPickerView i Action Sheets, wyewidencjonuj ActionSheetPicker
https://github.com/TimCinel/ActionSheetPicker
Włączono cocoapods. Obsługuje wszystkie przyciski anulowania i zakończenia na arkuszu akcji. Przykłady w przykładowym projekcie są świetne. Wybieram ActionSheetStringPicker, który z łatwością obsługuje tylko opcje oparte na ciągach, ale API może obsłużyć większość wszystkiego, o czym przyjdzie mi do głowy.
Początkowo uruchomiłem rozwiązanie podobne do odpowiedzi zaznaczonej znacznikiem, ale natknąłem się na ten projekt i zajęło mi około 20 minut, aby zintegrować rzeczy z moją aplikacją w celu użycia, w tym używania kokopodów: ActionSheetPicker (~> 0.0)
Mam nadzieję że to pomoże.
Pobierz projekt git i zapoznaj się z następującymi klasami:
Oto z grubsza większość dodanego przeze mnie kodu, plus importy * .h.
źródło
Aby zapobiec edycji UITextField podczas korzystania z UIPickerView do wybierania wartości (w języku Swift):
źródło
To obejście działa. Umieść przezroczysty UIView nad polem tekstowym i zaimplementuj następujący kod:
źródło
Spraw, aby Twój inputView był prezentowany przez ukryte pole tekstowe, które również zmienia tekst prezentowanego i wyłączonego.
źródło
Nie jestem do końca pewien, jak hacky to jest, ale jedyną rzeczą, która zrobiła sztuczkę w moim przypadku, było dodanie akcji docelowej i wywołanie endEditing. Ponieważ mój selektor kontroluje moją wartość UITextField.text, mogłem zamknąć klawiaturę, gdy tylko użytkownik kliknie pole. Oto kod:
źródło
Użyłem :
i działa dobrze
źródło
To zadziałało dla mnie
[textview setEditable:NO];
Powyższe odpowiedzi zbytnio komplikują sytuację.źródło