2009-08-23 18 views
12

Mam kilka UITextFields w UITableView. Użytkownik powinien mieć możliwość wstawiania tylko liczb i kropek. Aby to zrobić, ustawiam typ klawiatury na UIKeyboardTypeNumberPad i dodałem przycisk "." - w lewym dolnym rogu. Za każdym naciśnięciem przycisku wywoływana jest funkcja. Ta funkcja powinna wstawić kropkę w bieżącej pozycji kursora, ale jest to problem: UITextField nie ma właściwości selectedRange, więc nie jestem w stanie uzyskać aktualnej pozycji kursora. Czy ktoś wie, jak rozwiązać ten problem, czy jest jakiś inny sposób to zrobić? Dzięki.Wstaw ciąg znaków w pozycji kursora UITextField

Odpowiedz

33

W końcu znalazłem rozwiązanie tego problemu! Możesz umieścić tekst, który musi włożoną w kartonowe systemowym, a następnie wkleić go w bieżącej pozycji kursora:

[myTextField paste:self] 

znalazłem rozwiązanie na blogu tej osoby:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

Funkcjonalność pastę Specyficzny dla systemu operacyjnego V3.0, ale przetestowałem go i działa dobrze dla mnie z niestandardową klawiaturą.

Aktualizacja: Zgodnie z poniższym komentarzem Jasarien, dobrą praktyką jest najpierw zapisać zawartość spisu i przywrócić je później. Dla wygody, tu jest mój kodu:

// Get a reference to the system pasteboard 
    UIPasteboard* lPasteBoard = [UIPasteboard generalPasteboard]; 

    // Save the current pasteboard contents so we can restore them later 
    NSArray* lPasteBoardItems = [lPasteBoard.items copy]; 

    // Update the system pasteboard with my string 
    lPasteBoard.string = @"-"; 

    // Paste the pasteboard contents at current cursor location 
    [myUIField paste:self]; 

    // Restore original pasteboard contents 
    lPasteBoard.items = lPasteBoardItems; 

    [lPasteBoardItems release]; 
+0

To właśnie zadał pytanie. I doskonałe rozwiązanie. – oberbaum

+5

To świetne rozwiązanie. Warto jednak wspomnieć o tym, że przed umieszczeniem zawartości na stole montażowym należy zapisać zawartość pulpitu użytkownika, a następnie przywrócić zawartość użytkownika. W ten sposób nie mają oni pojęcia, że ​​korzystasz z tego obszaru roboczego, a twój kod jest dobrym obywatelem, ponieważ nie przekierowuje zawartości do obszaru roboczego użytkownika. – Jasarien

+0

To rozwiązanie jest niezgodne z VoiceOver. Zamiast mówić o wstawionym znaku, po prostu mówi "Wklej". –

0

Odczytaj wartość pola tekstowego jako napisu po naciśnięciu przycisku. Zmodyfikuj ciąg, a następnie ustaw wartość pola na nowy ciąg.

+0

tak, ale chodzi o to, że nie wie, jak chce zmodyfikować ciąg znaków. chce wstawić kropkę w miejscu, w którym znajduje się kursor, ale nie wie, gdzie jest kursor. – newacct

+0

Nie wstawiłoby to kropki w bieżącej pozycji kursora, tylko na końcu napisu. – WetFish

1

Jeśli szukasz do tworzenia pól tekstowych, które pozwalają wprowadzić miejsca dziesiętne może i sugerują, że raczej rozwiązać przecinek pewną precyzją i pozwalają użytkownikowi na wprowadzanie liczb w następujący sposób:

Zakładając, że precyzja jest 2 punkty po przecinku:

start: value is 0.00 
user enters 1: value is 0.01 
user enters 2: value is 0.12 
user enters 3: value is 1.23 
user enters 4: value is 12.34 

Zobacz What is the best way to enter numeric values with decimal points? dla podobnego rozwiązania dla waluty.

Jest to zdecydowanie prostsze rozwiązanie niż tworzenie niestandardowej klawiatury i radzenie sobie ze wszystkimi niuansami, które to podejście prezentuje. Jeśli jednak potrzebujesz dokładności o zmiennej długości, to podejście to może lepiej Ci pasować.

+0

Dzięki. Myślę, że to najlepszy sposób. – WetFish

2

Jest teraz fantastyczny rodzaj numeryczna klawiatura, która zawiera punkt dziesiętny, bez konfiguracji potrzebne, poza ustalone (nie w IB, a nie opcję tam jeszcze) na UITextField „s keyboardType nieruchomość do UIKeyboardStyleDecimalPad, tak:

textField.keyboardType = UIKeyboardTypeDecimalPad; 

To nie wszystkie wyszukane rzeczy już stara się zrobić automatycznie.

2

w Swift

to wstawienie tekstu w bieżącej pozycji kursora.

textField.insertText("Hello") 

Moja pełna odpowiedź na temat pracy z pozycji kursora jest here.

Powiązane problemy