Я пытаюсь создать 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
в отдельном месте, потому что мне нужно только изменить цвет текста между разделами ключевых слов, таких как «Go» и «end».
**Редактировать 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:®exErrorMined];
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]
, являющегося глобальным объектом.
В настоящее время, если пользователь введет «Начать кота снаружи конца», слова «кошка» и «снаружи» изменят цвет, когда пользователь введет «конец». Если пользователь вводит дополнительную строку, например: «Начать кота сейчас внутри конца», слово «кошка» автоматически станет зеленым еще до того, как пользователь введет «конец». Я хочу предотвратить это. Я хочу, чтобы цвет менялся только в отдельных разделах «начало……конец».
Все внешние переменные находятся в рабочем состоянии, единственное, что я пока не могу получить, это addAttribute
из массива диапазонов в matches
, потому что, хотя это не говорит, что это nil
, matches.count
равно 0 в условном выражении else if()
.
matches
локальной переменной или переменной экземпляра? - person rmaddy   schedule 09.07.2014minedMatches
или просто скопировать? - person Larme   schedule 09.07.2014NSLog
в первый пример кода, чтобы увидеть match.count, он фактически зарегистрирует правильное количество объектов. При этом, если бы я добавил тот жеNSLog
в код прямо передaddAttribute
, счетчик записался бы как 0. @LyricalPanda @timgcarlson - person momodude22   schedule 09.07.2014matches
равно нулю. - person Hot Licks   schedule 09.07.2014matches
объявлен внутри метода-(void)textViewDidChange
вместе с остальнымиNSRegularExpression
циклами и кодом. Я попытался сделатьmatches
свойством класса и написать об этом, но я тоже не смог заставить это работать. - person momodude22   schedule 09.07.2014-textViewDidChange
? - person kambala   schedule 09.07.2014addAttributes
находится в том же методе, что и объявление кодаmatches
и кодаNSRegualrExpression
, поэтому я думал, что локальная переменная будет работать? @rmaddy - person momodude22   schedule 09.07.2014matches
находятся в одной области видимости. Обновите свой вопрос, чтобы показать полную область, показывающую, как инициализируетсяmatches
, и все места, где он используется. И вы так и не сказали нам, в чем собственно проблема.matches
nil
? Если нет, то есть ли в нем какие-либо объекты? - person rmaddy   schedule 09.07.2014