UITextField Автозаполнение? - PullRequest
30 голосов
/ 07 июля 2010

Я пытаюсь выяснить, есть ли способ реализовать функцию автозаполнения в UITextField для определенных значений.

Я знаю, что UITextField может сделать это с помощью словаря iPhone (так же, как поиск в Google в Safari и т. Д.), Но я хочу иметь возможность программно настроить его на определенные значения, которые я указываю.

Как это сделать?

Ответы [ 7 ]

12 голосов
/ 28 июня 2011

Бретт,

Я сделал нечто очень похожее на это, работая над недавним и довольно крупным проектом.У нас был постоянно меняющийся список терминов автозаполнения, и мы создали вокруг него автозаполнение.

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

-(NSArray *)completionsForString:(NSString *)myString;

Затем проверьте класс UIMenuController.Это класс, который показывает опции вырезания / копирования / вставки во многих приложениях.Вы можете получить его общий экземпляр, самостоятельно заполнить пункты меню и показать его над текстовым полем.Затем пользователь может просто нажать на нужный ему термин.

В конце концов, решение действительно хорошо сработало для наших нужд.Я надеюсь, что это работает для вас.

7 голосов
/ 24 июня 2011

Ознакомьтесь с этим руководством от Рэя Вендерлиха, в котором демонстрируется один из способов достижения пользовательского автозаполнения

6 голосов
/ 26 января 2013

В качестве альтернативы, вы можете использовать этот подкласс UITextField (вдохновленный DOAutocompleteTextField):

https://github.com/hoteltonight/HTAutocompleteTextField

У него есть еще несколько функций и он активно развивается.В этом примере показано, как использовать массив в качестве источника данных для самосовершенствующегося текста.Он использует тот же подход, что и DOAutocompleteTextField, в котором он показывает предложенный текст завершения «ghosted» в текстовом поле при вводе пользователем.

2 голосов
/ 22 января 2014

С помощью вышеупомянутого учебника Рэя Вендерлиха я только что реализовал его версию для фильтрации имен в существующем UITableView.

Я установил делегат моего текстового поля в качестве моего контроллера представления, мой контроллер представления как UITextFieldDelegate и реализовал эти два метода:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *substring = [NSString stringWithString:textField.text];
    substring = [substring stringByReplacingCharactersInRange:range withString:string];
    [self searchAutocompleteEntriesWithSubstring:substring];
    return YES;
}

- (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring
{   
    NSMutableArray *autoCompleteArray = [[NSMutableArray alloc]init];
    [self retrieveData];

    for(NSString *curString in _staffTableArray)
    {
        NSString *lowerCaseCur = [curString lowercaseString];
        NSRange substringRange = [lowerCaseCur rangeOfString:substring];
        if (substringRange.location == 0)
        {
            [autoCompleteArray addObject:curString];
        }
    }
    if (![substring isEqualToString:@""])
    {
         _staffTableArray = [NSMutableArray arrayWithArray:autoCompleteArray];
    }  
    [_staffListTableView reloadData];
}
2 голосов
/ 24 июня 2011

Вы смотрели в UISearchDisplayController? В Stack Overflow есть несколько потоков , включая ссылки на базовые данные, если вы используете их. Также некоторые альтернативные методы , в других местах.

1 голос
/ 26 апреля 2013

Просто столкнулся с этой веткой, потому что мне нужно что-то похожее.Как насчет реализации собственного поиска с помощью метода UITextfieldDelegate:

- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

Как вы, вероятно, знаете, этот метод вызывается для каждой типизации UITextfield.

1 голос
/ 28 июня 2011

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

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text
      if ([string isEqualToString:@"StackO"]) {
           textField.text=@"StackOverflow";
      }
    return YES;
}
...