edittext ios textview swift3

ios - edittext - uitextfield swift 4



Cómo cambiar el color de los movimientos del texto dentro de UITextView en Swift3 (1)

He consultado algunas publicaciones existentes aquí e intenté implementar todo el código pero terminé sin poder implementar ningún código. En realidad, creo que comprendí cómo cambiar los colores de algunos textos dentro de UITextView si un texto se establece inicialmente, pero lo que no entiendo es que cuando mi texto tview comenzó a ingresar a la edición, parece que no funciona correctamente. En lo que sigue, es mi intento de código el que cumple de cerca mi comportamiento deseado;

func textViewDidBeginEditing(_ textView: UITextView) { let main_string = "" let getData: [String] = userDefaults.object(forKey: "myData") as! [String] print("/(getData)") let searchWords = "world" let range = (main_string as NSString).range(of: searchWords) let attribute = NSMutableAttributedString.init(string: main_string) attribute.addAttribute(NSForegroundColorAttributeName, value: UIColor.red , range: range) mytextView.attributedText = attribute }

MyData datos de entrada nombrando es MyData . Traté de usar un for-loop para sacar todos los elementos de getData y usarlos como valores individuales. Sin embargo, en la consola, hay tantas líneas de explicación. Creo que esta es una forma adecuada de escribir, pero mi mac dice nooooooo. Sin embargo, si configuro un String dentro de main_string y searchWords , por ejemplo, "esta es mi pregunta. Quiero que la gente me ayude del mundo" en main_string y "world" en searchWords como está escrito en el código. Luego, después de cargar la aplicación, en mi texto veo la palabra, "mundo" se resalta en rojo perfectamente, pero después de la palabra mundial, todo el texto está en rojo. No entiendo por qué estoy siendo torturado por este error desconocido.

Entonces, lo que quiero lograr es

  1. a partir de la fecha de guardado en myData , solo deseo que las palabras almacenadas se resalten oportunamente cuando los usuarios escriben. Por ejemplo, si un usuario escribe "hola" y "mundo". Luego myData guarda y solo se resaltarán cuando se tipeen. Y vuelva al color normal cuando se tipean las palabras que no están almacenadas.

Supongo que carezco de alguna explicación. Si necesita saber algo, por favor hágamelo saber. ¡¡Muchas gracias!!


En esto, he tomado una cadena de "mundo" como ejemplo. Cuando estás escribiendo en textview entonces este método está en funcionamiento

func textViewDidChange(_ textView: UITextView) { let attrStr = NSMutableAttributedString(string:txtview.text) let inputLength = attrStr.string.characters.count let searchString = "world" let searchLength = searchString.characters.count var range = NSRange(location: 0, length: attrStr.length) while (range.location != NSNotFound) { range = (attrStr.string as NSString).range(of: searchString, options: [], range: range) if (range.location != NSNotFound) { attrStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: NSRange(location: range.location, length: searchLength)) range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length)) textView.attributedText = attrStr } } }

Pero cuando ya ha establecido el texto inicial de la vista de texto, utilice este método

func textViewDidBeginEditing(_ textView: UITextView) { //Just set your text as you set in textview let attrStr = NSMutableAttributedString(string: "hello world I ma jeckjklwefljlwjflkjwfkljelwfjklfgjwklfjlkwgjwlgkjwklsgjklsjgklsdjgkljdslkgjsdlkgjlksdjgldjsgldjskl world nsfhjklshfklhsllsd fgiw world") let inputLength = attrStr.string.characters.count let searchString = "world" let searchLength = searchString.characters.count var range = NSRange(location: 0, length: attrStr.length) while (range.location != NSNotFound) { range = (attrStr.string as NSString).range(of: searchString, options: [], range: range) if (range.location != NSNotFound) { attrStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: NSRange(location: range.location, length: searchLength)) range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length)) textView.attributedText = attrStr } } }

Para cadenas múltiples, puede hacer esto como SWIFT 3

func textViewDidChange(_ textView: UITextView) { let attrStr = NSMutableAttributedString(string: txtview.text) let inputLength = attrStr.string.characters.count let searchString : NSArray = NSArray.init(objects: "hello","world") for i in 0...searchString.count-1 { let string : String = searchString.object(at: i) as! String let searchLength = string.characters.count var range = NSRange(location: 0, length: attrStr.length) while (range.location != NSNotFound) { range = (attrStr.string as NSString).range(of: string, options: [], range: range) if (range.location != NSNotFound) { attrStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: NSRange(location: range.location, length: searchLength)) range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length)) textView.attributedText = attrStr } } } }

C OBJETIVO
Para múltiples cadenas, puedes hacer esto

-(void)textViewDidChange:(UITextView *)textView { NSMutableAttributedString *attstr = [[NSMutableAttributedString alloc]initWithString:textView.text]; NSUInteger characterCount = [attstr length]; NSArray *arr = [[NSArray alloc]initWithObjects:@"football",@"player",nil]; for (int i=0; i<arr.count; i++) { NSUInteger searchlength = [[NSString stringWithFormat:@"%@",[arr objectAtIndex:i]] length]; NSRange range1 = NSMakeRange(0, attstr.length); while (range1.location != NSNotFound) { range1 =[attstr.string rangeOfString:[NSString stringWithFormat:@"%@",[arr objectAtIndex:i]] options:0 range:range1]; if (range1.location !=NSNotFound) { [attstr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(range1.location, searchlength)]; [attstr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:20.0] range:range1]; range1 = NSMakeRange(range1.location + range1.length, characterCount -(range1.location + range1.length)); textView.attributedText = attstr; } } }