2012-09-17 17 views
6

Quale evento viene generato quando un blocco di testo viene incollato in un UITextView? Devo modificare il frame della mia textView quando il testo viene incollato.come sapere quando il testo viene incollato in UITextView

Grazie per la lettura.

+0

Ho un requisito del genere [UIPasteboard generalPasteboard] .string] è più di 20 caratteri voglio solo per sostituire un primo momento solo 20 caratteri, per cui qui di metodo shouldChange testo già arrivato con tutti i copiato voglio rendere chould cambiato come vero e cambiare fino ai primi 20 caratteri. Poiché sto lavorando con swift, non posso modificare il parametro/valore stringa perché viene lasciato costante. Qualcuno può aiutarmi su questo. Grazie - –

risposta

7

tuo UITextView chiamerà il suo metodo UITextViewDelegate

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 

se un delegato è stato istituito. Questo viene chiamato sia quando un carattere viene digitato sulla tastiera, sia quando il testo viene incollato nella vista testo. Il testo incollato è l'argomento replacementText.

Vedi http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextViewDelegate_Protocol/Reference/UITextViewDelegate.html#//apple_ref/occ/intf/UITextViewDelegate

+0

Ho un requisito come [UIPasteboard generalPasteboard] .string] è più di 20 caratteri voglio solo sostituire solo i primi 20 caratteri, quindi qui nel testo del metodo shouldChange è già venuto con tutti i copiato voglio rendere chould cambia come vero e cambia fino ai primi 20 caratteri. Poiché sto lavorando con swift, non posso modificare il parametro/valore stringa perché viene lasciato costante. Qualcuno può aiutarmi su questo. Grazie - –

19

Ecco quello che io uso per rilevare eventi pasta in UITextView:

// Set this class to be the delegate of the UITextView. Now when a user will paste a text in that textview, this delegate will be called. 
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 

    // Here we check if the replacement text is equal to the string we are currently holding in the paste board 
    if ([text isEqualToString:[UIPasteboard generalPasteboard].string]) { 

     // code to execute in case user is using paste 

    } else { 

     // code to execute other wise 
    } 

    return YES; 
} 
+0

Soluzione interessante, ha funzionato per me. Grazie! –

+0

Ho un requisito come [UIPasteboard generalPasteboard] .string] è più di 20 caratteri voglio solo sostituire solo i primi 20 caratteri, quindi qui nel testo del metodo shouldChange è già venuto con tutti i copiato voglio rendere chould cambiare come vero e cambiare fino a primi 20 caratteri. Poiché sto lavorando con swift, non posso modificare il parametro/valore stringa perché viene lasciato costante. Qualcuno può aiutarmi su questo. Grazie –

1

carlos16196 era un buon approccio, ma vorrei anche modificarlo cambiando [text isEqualToString:[UIPasteboard generalPasteboard].string]-[text containsString:[UIPasteboard generalPasteboard].string]

In questo modo, rilevi quando l'utente incolla nella visualizzazione testo dopo un altro testo digitato che non si trova nell'UIPasteboard.

Questo è il codice:

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 

// Here we check if the replacement text is equal to the string we are currently holding in the paste board 
if ([text containsString:[UIPasteboard generalPasteboard].string]) { 

    // code to execute in case user is using paste 

} else { 

    // code to execute other wise 
} 

return YES; 
} 
+1

hai dimenticato di fare la modifica che menzioni nel tuo codice postato –

+0

Grazie, non me ne sono accorto. – danielrosero

+0

Ho un requisito come [UIPasteboard generalPasteboard].string] è più di 20 caratteri voglio solo sostituire solo i primi 20 caratteri, quindi qui nel testo del metodo shouldChange è già venuto con tutti i copiato voglio rendere chould modificato come vero e cambiare fino ai primi 20 caratteri. Poiché sto lavorando con swift, non posso modificare il parametro/valore stringa perché viene lasciato costante. Qualcuno può aiutarmi su questo. Grazie - –

8

Controllo stringa del cartone da if string == UIPasteboard.general.string prende un paio di secondi, se si dispone di lunga frase nel tavolo di montaggio. L'utente vede la tastiera bloccata durante questo controllo. La mia soluzione è di controllare se la lunghezza di nuovi caratteri è più lunga di 1. Se è più lungo di 1, la stringa proviene dal tavolo di montaggio.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     if string.characters.count > 1{ 
      //User did copy & paste 

     }else{ 
      //User did input by keypad 
     }    
     return true 
} 
+0

Tecnicamente, questo non rileverebbe se l'utente stava incollando un carattere dal tavolo di montaggio (perché perché perché?) O digitando un carattere, ma a tutti gli effetti, fa il lavoro. È quello che userò. –

0

provare sottoclassi UITextview e sovrascrivere questa funzione.

public override func paste(_ sender: Any?) 
-1

a Swift 4:

func textViewDidChange(_ textView: UITextView) { 

    if(textView.text == UIPasteboard.general.string) 
    { 
     //Text pasted 
    } 
} 
Problemi correlati