Agregando un sufijo de text no editable a un UITextField

Tengo un UITextField que me gustaría agregar un "?" sufijo a todo el text ingresado.

El usuario no debería poder eliminar este "?" o agregue text al lado derecho del mismo.

¿Cuál es la mejor manera de hacerlo?

Probablemente necesitará subclass UITextField y anulará su drawText: método para dibujar un "?" Adicional carácter a la derecha del text real. (En lugar de agregar un "?" Al text de la vista.

Use el protocolo UITextFieldDelegate para alterar la cadena cada vez que se UITextFieldDelegate el campo. Aquí hay una puñalada rápida; Esto necesitará trabajo, pero debería comenzar.

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString * currentText = [textField text]; if( [currentText characterAtIndex:[currentText length] - 1] != '?' ){ NSMutableString * newText = [NSMutableString stringWithString:currentText]; [newText replaceCharactersInRange:range withString:string]; [newText appendString:@"?"]; [textField setText:newText]; // We've already made the replacement return NO; } // Allow the text field to handle the replacement return YES; } 

Tuve este problema y escribí una subclass para agregar esta funcionalidad: https://github.com/sbaumgarten/UIPlaceholderSuffixField . Es de esperar que hayas encontrado una solución por ahora, pero si no lo has hecho, debería funcionar.

Para una sola línea UITextField debería poder medir el tamaño del NSString (tiene una function de medición allí, en algún lugar) y mover una UILabel a la position correcta.

Yo agregaría un método que se llama cuando finaliza la edición:

 `- (void)editDidFinish { NSString* str=[[NSString alloc] init]; str=myEdit.text; [str stringByAppendingString:@"?"]; myEdit.text=str; }` 

Me doy count de que esta respuesta es tardía, pero encontré que la mayoría de estos no funcionaron para mi situación. Tengo un UITextField que simplemente quiero forzar para tener un sufijo que el usuario no puede editar. Sin embargo, no quiero subclass UITextView, modificar cómo se maneja el dibujo, etc. Solo quiero evitar que el usuario modifique el sufijo.

Primero, aseguro que el sufijo se establece en el campo de text cuando se produce la edición. Esto podría hacerse de muchas maneras dependiendo de su escenario. Para el mío, lo quería desde el principio, así que simplemente establecí la propiedad de text del campo de text igual al sufijo cuando la vista se carga y almacena la longitud del sufijo para más adelante. Por ejemplo:

 - (void)viewDidLoad { [super viewDidLoad]; myTextField.text = "suffix"; _suffixLength = myTextField.text.length; } 

Luego utilicé el protocolo UITextFieldDelegate como Josh sugirió anteriormente, pero use la longitud de la cadena y el range para asegurarse de que nada edite el sufijo:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // Determine starting location of the suffix in the current string int suffixLocation = textField.text.length - _suffixLength; // Do not allow replacing anything in/past the suffix if (range.location + range.length > suffixLocation) { return NO; } // Continue with delegate code... } 

Esto debería funcionar para cualquier valor de sufijo que asigne al campo de text.

Este método de class que he escrito en Objective-C, te ayuda a agregar un text de sufijo a un UITextField . UILabel que funcione, debe inicializar UILabel al prefijo o sufijo en su UITextFieldLabel siguiente manera:

 myTextField.rightView = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, myTextField.frame.size.height)]; myTextField.rightViewMode = UITextFieldViewModeAlways; [MyClass UpdateUITextFieldSuffix:myTextField withString:@"My Suffix!"]; 

Una vez que tengamos el UILabel adjunto a UITextField , puede utilizar este método de class para actualizar el text, y este text se cambiará automáticamente de tamaño para caber en el campo.

 + (BOOL)UpdateUITextFieldSuffix:(UITextField*)textField withString:(NSString*)string { BOOL returnUpdateSuffix = NO; if (string != nil && [string respondsToSelector:@selector(length)] && [string length] > 0) { NSObject *labelSuffix = textField.rightView; if (labelSuffix != nil && [labelSuffix respondsToSelector:@selector(setText:)]) { [(UILabel*)labelSuffix setTextAlignment:NSTextAlignmentRight]; [(UILabel*)labelSuffix setText:string]; [(UILabel*)labelSuffix setBackgroundColor:[UIColor networkingColor]]; { NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: ((UILabel*)labelSuffix).font, NSFontAttributeName,nil]; CGRect frame = [((UILabel*)labelSuffix).text boundingRectWithSize:CGSizeMake(0.0f, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributesDictionary context:nil]; CGSize size = frame.size; CGRect newFrame = [(UILabel*)labelSuffix frame]; newFrame.size.width = size.width; [(UILabel*)labelSuffix setFrame:newFrame]; [(UILabel*)labelSuffix setNeedsLayout]; [(UILabel*)labelSuffix layoutIfNeeded]; } returnUpdateSuffix = YES; } } return returnUpdateSuffix; } 

He escrito el siguiente método para lograr la tarea anterior de colocar el sufijo no editable en UITextField:

  - (void)setSuffixText:(NSString *)suffix { UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; [label setBackgroundColor:[UIColor clearColor]]; [label setFont:[UIFont fontWithName:self.tfdDistance.font.fontName size:self.tfdDistance.font.pointSize]]; [label setTextColor:self.tfdDistance.textColor]; [label setAlpha:.5]; [label setText:suffix]; CGSize suffixSize = [suffix sizeWithFont:label.font]; label.frame = CGRectMake(0, 0, suffixSize.width, self.tfdDistance.frame.size.height); [self.tfdDistance setRightView:label]; [self.tfdDistance setRightViewMode:UITextFieldViewModeAlways]; }​ 

De acuerdo, estoy definitivamente demasiado tarde, pero tal vez pueda ayudar a alguien de cualquier manera: la forma prevista de lograr esto es mediante un NSFormatter personalizado. Aquí está la documentation: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFormatter_Class/Reference/Reference.html

La idea básica es la siguiente: crea una subclass de NSFormatter y anula al less los dos methods de trabajo:

 -stringObjectForValue: 

esto producirá dipsplay-String del valor almacenado en el object (es decir, agregue su signo de interrogación aquí)

 -objectValue:ForString:errorDescription 

aquí, necesita transformar la cadena de visualización en un object que desea almacenar, es decir, eliminar el signo de interrogación

El formateador se puede usar para convertir los datos de los objects almacenados en cadenas adecuadas para su presentación al usuario. La gran ventaja es que puede usar formateadores donde quiera que su cadena aparezca en la interfaz de usuario. No está limitado a ciertos elementos de interfaz de usuario como la solución en la que anula -drawText en UITextField. Es simplemente conveniente.