2009-07-14 14 views
6

Mam problem z próbą zmiany zachowania Wytnij/Kopiuj/Wklej z UITextView. Co chcę osiągnąć: wykryć, kiedy użytkownik wkleił jakiś tekst do UITextView. Kiedy to wykryję, sprawdzę dane i zrobię swoje.Wykryj, kiedy użytkownik kliknie przycisk wklejania w UITextView

Zgodnie z dokumentami dowiedziałem się o UIResponder.

Stworzyłem więc prostą klasę, która dziedziczy UITextView. w pliku .m Tworzę 1 funkcję o nazwie.

-(void) paste:(id)sender{ 
    NSLog(@"paste button was pressed do something"); 
} 

Ale z jakiegoś powodu nigdy nie wydaje ognia. Mogłabym otrzymać instrukcję SELECT do pracy i śledzenia danych.

-(void) select:(id)sender 

1. Czy jest to właściwy sposób wykrywania wklejania w UITextView? 2. Teraz śledzę kupno liczby zmian UITextView znaków i jeśli jest większa niż jeden znak, podejrzewam, że może to być operacja wklejania. Ale ponieważ iPhone może autouzupełnić słowa, np. Wedn (idzie do środy), to prawdopodobnie nie jest to operacja wklejania.

W Konstruktorze interfejsów, wybrałem mój tekstView w moim pliku NIB, i wybrałem jego "Tożsamość klasy" do mojej prawie stworzonej klasy wcześniej i wiem, że ten plik działał jako podklasa, ale po prostu nie reagowałby na wklejanie zdarzenie.

dzięki.

Odpowiedz

2

Jeśli ktoś nadal potrzebuje krótkiego i łatwego rozwiązania, udostępnię go. Używam wspaniałej kategorii NSObject + REResponder od REKit project. Rozwiązanie jest tak proste, jak to:

- (void)hookMessageTextFieldPasteAction 
{ 
    void (^textFieldDidPasteBlock)(id receiver, id sender) = ^(id receiver, id sender) 
    { 
     NSLog(@"paste hook"); 
    }; 
    [self.messageTextField respondsToSelector:@selector(paste:) withKey:nil usingBlock:textFieldDidPasteBlock]; 
} 
1

Tak powyższy kod do wklejenia jest poprawny zgodnie z Dokumentacją Apple, która odnosi się do niej here.

- (void)paste:(id)sender 

Podejrzewam, że wdrażasz go w niewłaściwym pliku. Powinieneś implementować go w pliku, który jest częścią łańcucha 1. Responder. Czy podklasowałeś UITextView lub używasz wanilii w swoim kontrolerze ViewController?

Hmmm Myślę, że problem polega na tym, że konieczne może być przekształcenie podklasy UITextView w delegata, aby metoda delegatów działała, ponieważ nie jest to możliwe dzięki wyglądowi elementów. Spróbuję znaleźć sposób, w jaki to zrobiłem wcześniej.

Okej, myślę, że znalazłem. Myślę, że trzeba to zrobić na podklasy klasy UITextField:

@interface mySpecialTextFieldClass : NSObject <UITextFieldDelegate> 
{ 

} 

Dodając, że na koniec powinien pracować, dać to spróbować! To, co robi, sprawia, że ​​twoja podklasa staje się obiektem typu, do którego delegat może wysłać powiadomienie ... to jest polimorfizm, chyba, że ​​ktoś chce mnie tu skorygować :)

Ostatnia rzecz do wypróbowania Johna w ViewController który zawiera IBOutlet do UITextView, spróbuj wywołanie tej metody na przykład w UITextView:

[myUITextView setDelegate:self]; 

Wystarczy rzucić coś zupełnie losowy tam spróbuj ustawić, aby stało się pierwsza odpowiedź.

[myUITextView becomeFirstResponder]; 

To się nazywa programowanie w ciemnych dzieciaków! I jest bardzo zły sposób programowania, ale przyznaję, że to robię i czasami się to opłaca: P lol.

+0

Witam, podklasowałem UITextView i wiem, że podklasa działała, kupując implementację innych metod. Posiadałem również kod pasty w mojej podklasie. Ale to nie działa (dobrze w symulatorze). –

+0

Uaktualniłem moją odpowiedź, ale Symulator nie powinien sprawić żadnej różnicy, żeby wiedzieć. I dał +1 btw: P –

+0

Witaj ponownie, użyłem tego, jak zasugerowałeś mieć UITextFeildDelegate. @interface BSTextView: UITextView --- tutaj jest coś całkiem przypadkowy --- jeśli wdrożyć metodę "wybierz", to działa na "Wybierz" - (void) wybrać: (id) nadawca { \t NSLog (@ "Chcę wybrać"); } ale nadal nie ma miłości z urządzenia lub symulatora, jeśli naciskam przycisk. Myślę, że to właściwie BŁĄD ... –

3

UITextView ma widok, który obsługuje cięcie, kopiowanie, wklejanie. To UIWebDocumentView. Więc jeśli UITextView jest pierwszym respondentem, UIWebDocumentView dostanie go najpierw zamiast swojej implementacji. Chciałbym zastąpić te funkcje, więc jest to bardzo frustrujące.

+0

Cześć Lillian, czy ty kiedykolwiek sprawiłeś, że to działa? –

+0

Przepraszamy. bez powodzenia ... Mam nadzieję, że Apple otworzy to dla nas. –

3

To samo dzieje się również ze mną. Wybierz (i czasami kopiuj) zostanie wywołany, ale wklej nigdy.

Symulowałem zachowanie przy użyciu polecenia textViewDidChange, w którym zawsze sprawdzam różnicę między bieżącym tekstem a poprzednim. Jeśli jest więcej liter, a długość tekstu jest większa niż musi być wklejona.

Mam nadzieję, że Apple to naprawi.

+0

To jest dokładnie to, co robię również. Ale bądź ostrzeżony, że rzeczy takie jak w środę automatycznie się uzupełnią i dadzą ci fałszywe odczyty. więc bądź ostrożny i zwiększ wartość textview.length o więcej niż 1. –

Powiązane problemy