Создайте NSMutableArray из NSRange и правильно прочитайте значения диапазона позже

Я пытаюсь создать NSMutableArray из диапазонов, обнаруженных из NSRegularExpression, но я не могу получить NSMutableArray держать предметы. Помогите?

Объявите массив следующим образом: NSMutableArray *matches = [[NSMutableArray alloc]init];

В конце моего цикла регулярного выражения:

for (NSTextCheckingResult *aMatch in minedMatches) {
    NSRange matchRange = [aMatch range];
    [matches addObject: [NSValue valueWithRange:matchRange]];
}

В другой части моего кода у меня есть цикл for, который я хочу использовать matches; однако, это не полный:

if (matches != nil) {
            for (int i = 0; i < matches.count; i++) {
                [attributedString addAttribute:NSForegroundColorAttributeName value: minedColor range:[[matches objectAtIndex:i]rangeValue]]; 
            }
        }

**Заметка:

minedColor, minedMatches а также attributedString объявлены правильно во всем моем коде. я использую addAttribute в отдельном месте, потому что мне нужно только изменить цвет текста между разделами ключевых слов, таких как "Перейти" и "конец".

** Редактировать 1 (запрос всего метода)

- (void)textViewDidChange:(UITextView *)textView {

self.notepadTextView.font = [UIFont fontWithName:@"ProximaNova-Regular" size:20]; //custom font
UIFont *normalFont = [UIFont fontWithName:@"ProximaNova-Regular" size:20];//fail-safe font for attributed string
NSString *textEntryContents = [[self notepadTextView ]text]; //declares user inputted string
[gCore processSpeechText:textEntryContents]; //internal processing
NSMutableArray *mined = [gCore getHighLightContainer]; //array with strings that need to be colored
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:textEntryContents
                                                                                     attributes:@{NSFontAttributeName: normalFont}]; //initialize attributed string
matches = [[NSMutableArray alloc]init]; //initialize matches
UIColor *minedColor = [UIColor colorWithRed:(126.0/255.0) green:(204.0/255.0) blue:(136.0/255.0) alpha:1.0]; //initialize color for attributed string

BOOL colorChangeDidRun = '\0'; //initialize if color was changed

if ([gCore dataMiningInProgress] == YES) { //if it is the start of a section
    colorChangeDidRun = NO; 
    if (mined != nil){ //fail-safe
        for (int i = 0; i < mined.count; i++){
            NSError *regexErrorMined;
            NSRegularExpression *regexMined = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"%@",mined[i]]
                                                                                        options:NSRegularExpressionCaseInsensitive error:&regexErrorMined];
            if (!regexErrorMined) {
                NSArray *minedMatches = [regexMined matchesInString:[attributedString string]
                                                            options:0
                                                              range:NSMakeRange(0, [[attributedString string] length])];
                for (NSTextCheckingResult *aMatch in minedMatches) {
                    NSRange matchRange = [aMatch range];
                    [matches addObject: [NSValue valueWithRange:matchRange]]; //add range values to matches array                     
                }
            }
        }

    }

}
else if ([gCore dataMiningInProgress] == NO) { //if end of section
    if (colorChangeDidRun == NO) { //if the color change has not happened yet
        if (matches != nil) {
            for (int i = 0; i < matches.count; i++) {
                colorChangeDidRun = YES; //prevent color change in unnecessary spots
                [attributedString addAttribute:NSForegroundColorAttributeName value: minedColor range:[[matches objectAtIndex:i]rangeValue]];            
            }
        }
    }
}

self.notepadTextView.attributedText = attributedString; //output attributed string

}

Изначально я не публиковал весь метод, потому что он требует много объяснений, как я уверен, вы можете видеть. По сути, пользователь будет вводить текст в текстовом представлении. Этот текст затем добывается, если слова попадают между "начало" и "конец". Эти ключевые слова сигнализируют о триггерах, которые изменяют значение [gCore dataMiningInProgress], который является глобальным объектом.

В настоящее время, если пользователь введет "Начать кошку с внешнего конца", слова "кошка" и "снаружи" изменят цвет, когда пользователь введет "конец". Если пользователь вводит больше строк, таких как: "Start the cat is inside end", слово "cat" автоматически станет зеленым даже до того, как пользователь введет "end". Я хочу предотвратить это. Я только хочу, чтобы цвет менялся во время отдельных разделов "начало...... конец"

Все внешние переменные находятся в рабочем состоянии, единственное, что я пока не могу получить, это addAttribute из массива диапазонов в matches потому что, хотя это не говорит, что это nil , matches.count 0 в else if() условна.

2 ответа

Решение

Используя предложения от @kambala и @LyricalPanda, моя оригинальная проблема matches являющийся nil в else Заявление было решено с помощью обзорной проблемы. Хотя я создал свойство в заголовочном файле для matches а также @synthesizeсделал бы это, мой NSMutableArray не было написано в масштабе класса. Я изменил область, чтобы создать глобальную переменную для matches к нему теперь можно получить доступ из любого файла. Похоже, трата некоторой мощности кодирования, но именно так я смог получить MutableArray держать объекты за пределами одного экземпляра. С использованием @extern Команда, позволяет успешно читать и записывать массив, полный диапазонов.

Здесь у вас есть очень простая ошибка: невозможно выполнить обе ветви if а также else if за один проход. Так что если [gCore dataMiningInProgress] == YES только тогда matches будет заполнен объектами, и это все. Если условие NO, затем matches это пустой массив (потому что он явно не был заполнен объектами).

PS Это бесполезно писать if ([gCore dataMiningInProgress] == YES) ... else if ([gCore dataMiningInProgress] == NO) потому что если он не оценивает YESто это точно NO:) Так что это просто if-else строительство.

Другие вопросы по тегам