Добавление не редактируемого текстового суффикса в UITextField - PullRequest
8 голосов
/ 27 ноября 2011

У меня есть UITextField, в который я хотел бы добавить "?" суффикс для всего введенного текста.

Пользователь не должен иметь возможность удалить это "?" или добавьте текст справа от него.

Какой лучший способ сделать это?

Ответы [ 9 ]

4 голосов
/ 28 ноября 2011

Используйте протокол UITextFieldDelegate для изменения строки всякий раз, когда поле редактируется. Вот быстрый удар в это; это потребует работы, но это должно помочь вам начать.

- (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;
}
2 голосов
/ 27 ноября 2011

Возможно, вам понадобится создать подкласс UITextField и переопределить его drawText: метод для рисования дополнительного "?" символ справа от фактического текста. (Вместо того, чтобы фактически добавлять «?» К тексту представления.

1 голос
/ 30 апреля 2014

Я понимаю, что этот ответ опоздал, но я обнаружил, что большинство из них не работает для моего сценария. У меня есть UITextField, который я просто хочу заставить суффикс, который пользователь не может редактировать. Однако я не хочу создавать подкласс UITextView, изменять способ обработки чертежей и т. Д. Я просто хочу запретить пользователю изменять суффикс.

Во-первых, я проверяю, что суффикс установлен в текстовом поле при редактировании. Это может быть сделано любым количеством способов в зависимости от вашего сценария. Для моего, я хотел, чтобы это было там с самого начала, поэтому я просто установил текстовое свойство text field равным суффиксу при загрузке представления и сохранил длину суффикса для дальнейшего использования. Например:

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

Затем я использовал протокол UITextFieldDelegate , как предлагал Джош, но использовал длину строки и диапазон, чтобы ничего не редактировало суффикс:

- (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...
}

Это должно работать для любого значения суффикса, которое вы присваиваете текстовому полю.

1 голос
/ 02 января 2013

У меня была эта проблема, и я написал подкласс для добавления этой функциональности: https://github.com/sbaumgarten/UIPlaceholderSuffixField. Надеюсь, вы уже нашли решение, но если нет, это должно сработать.

0 голосов
/ 05 сентября 2016

Я написал следующий метод для выполнения вышеупомянутой задачи размещения не редактируемого суффикса в 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];
}​
0 голосов
/ 29 октября 2014

Этот метод класса, который я написал в Objective-C, помогает вам добавить текст суффикса к UITextField.Я приказываю, чтобы это работало, вам нужно инициализировать UILabel для префикса или суффикса в вашем UITextFieldLabel следующим образом:

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!"];

Как только мы подключим UILabel к UITextFieldВы можете использовать этот метод класса для обновления текста, и этот текст будет автоматически изменен, чтобы поместиться в поле.

+ (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 redColor]];
            {
                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;
}
0 голосов
/ 09 октября 2013

ОК, я определенно слишком поздно, но, возможно, я могу помочь кому-то в любом случае: предполагаемый способ сделать это - использовать собственный NSFormatter.Вот документы: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFormatter_Class/Reference/Reference.html

Основная идея такова: вы создаете подкласс NSFormatter и переопределяете по крайней мере два рабочих метода:

-stringObjectForValue:

, что приведет к провалу-Строка из значения, хранящегося в объекте (т. Е. Добавить здесь свой вопросительный знак)

-objectValue:ForString:errorDescription

здесь, вам необходимо преобразовать строку отображения в объект, который вы хотите сохранить, т.е. удалить вопросительный знак

Затем форматтер можно использовать для преобразования данных из хранимых объектов в строки, подходящие для представления пользователю.Большим преимуществом является то, что вы можете использовать средства форматирования везде, где ваша строка появится в пользовательском интерфейсе.Он не ограничен определенными элементами пользовательского интерфейса, такими как решение, в котором вы переопределяете -drawText в UITextField.Это просто привет, удобно.

0 голосов
/ 28 ноября 2011

Я бы добавил метод, который вызывается после завершения редактирования:

`- (void)editDidFinish {
  NSString* str=[[NSString alloc] init];
  str=myEdit.text;
  [str stringByAppendingString:@"?"];
  myEdit.text=str;
}`
0 голосов
/ 27 ноября 2011

Для однострочного UITextField вы должны быть в состоянии измерить размер строки NSS (в ней есть функция измерения где-то) и переместить UILabel в правильное положение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...