Реализация автозаполнения хэштегов/тегов Objective-C

Я пытался реализовать автозаполнение хэштегов с помощью target-C, как показано на рисунке.

введите здесь описание изображения

Я нашел это немного сложнее, чем ожидалось. Я ищу более конкретную реализацию для добавления и удаления хэштегов. Например, хэштег нужно удалить сразу целиком. Мне было интересно, есть ли у кого-нибудь подобный опыт, и есть ли более эффективный способ его реализации. Спасибо


person changey    schedule 05.04.2014    source источник
comment
возможный дубликат Реализация автозаполнения в iOS   -  person jscs    schedule 06.04.2014
comment
Что вы подразумеваете под автозаполнением? я почти уверен, что автозаполнение хэштега точно такое же, как автозаполнение обычного текста.   -  person Mostafa Berg    schedule 06.04.2014
comment
@JoshCaswell спасибо за ответ! Я искал автозаполнение, но я ищу более конкретную реализацию для добавления и удаления хэштегов. Например, хэштег нужно удалить сразу целиком.   -  person changey    schedule 06.04.2014


Ответы (1)


В итоге я написал несколько функций, которые мне показались немного уродливыми, но они работают. Может быть, есть какие-то более эффективные способы его реализации.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //user is a singleton instance
    User *user = [User sharedUser];        
    user.autocompleteTableView.hidden = NO;

    int identifiedTagsStringLength = [self.identifiedTagsString length];
    int cursorLocation = range.location;

    //insert characters
    if (range.location >= identifiedTagsStringLength) {

        NSString *newSearch =@"";
        NSRange newRange;
        if(identifiedTagsStringLength != 0) {
            newSearch = [urlField.text substringFromIndex:identifiedTagsStringLength];
            newRange = NSMakeRange(range.location - identifiedTagsStringLength, 0);
        }
        else {
            newSearch = textField.text;
            newRange = range;
        }

        NSString *substring = [NSString stringWithString:newSearch];
        substring = [substring stringByReplacingCharactersInRange:newRange withString:string];
        [self searchAutocompleteEntriesWithSubstring:substring];

        if (cursorLocation > currentTagsRange) {
            currentTagsRange = cursorLocation;
        }
    }
    //delete tags
    else {
        if ([self.ranges count] != 0 && cursorLocation < currentTagsRange) {
            int rangeLength = [self.ranges count];
            int toBeRemovedIndex = 0;
            for (int i = 0; i< rangeLength; i++) {
                if (cursorLocation >= [[self.ranges objectAtIndex:i][0] intValue]
                    && cursorLocation <= [[self.ranges objectAtIndex:i][1] intValue]) {
                    toBeRemovedIndex = i;
                }
            }
            [self.tags removeObjectAtIndex:toBeRemovedIndex];
            [self updateRanges];
            NSString *outputString = @"";

            for (NSString *tag in self.tags) {
                outputString = [NSString stringWithFormat:@"%@#%@ ", outputString,
                tag];
            }
            urlField.text = outputString;
            self.identifiedTagsString = urlField.text;
            currentTagsRange = [outputString length] - 1;
        }
    }

    return YES;
}

- (void)updateRanges {
    self.ranges = [[NSMutableArray alloc] init];
    int startIndex = 0;

    for (NSString *tag in self.tags) {
        startIndex = [self.ranges count] == 0 ? 0 : [[self.ranges lastObject][1] intValue] + 1;

        int tagLength = [tag length];
        NSArray  *range = [NSArray arrayWithObjects:[NSNumber numberWithInt:startIndex], [NSNumber numberWithInt:startIndex + tagLength + 1], nil];
        [self.ranges addObject: range];
    }
}

#pragma mark UITableViewDataSource methods

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {


    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

    if (self.identifiedTagsString == NULL) {
        self.identifiedTagsString = @"";
    }
    [self.tags addObject: selectedCell.textLabel.text];

    [self updateRanges];

    NSString *output = @"";
    for (NSString *tag in self.tags) {
        output = [NSString stringWithFormat:@"%@#%@ ", output, tag];
    }

    urlField.text = output;
    User *user = [User sharedUser];
    user.autocompleteTableView.hidden = YES;

    self.identifiedTagsString = urlField.text;
    currentTagsRange = [urlField.text length];

}
person changey    schedule 05.04.2014
comment
tags, currentTagsRange, идентифицированныеTagsStringLength и другие в сниппете нет. Он не полный. - person Nik Kov; 17.06.2019