Использование NSRegularExpression для создания пользовательского типа NSDataDetector

Я пытаюсь создать пользовательские детекторы данных для контента в UITextView. Я хотел бы иметь возможность сделать что-то вроде этого:

tv.dataDetectorTypes = UIDataDetectorTypeAll;

но вместо UIDataDetectorTypeAll я хочу использовать свой собственный UIDataDetector на основе следующего регулярного выражения:

    NSError *error = nil;        
    NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:@"(ID: [0-9]+)"
                                                                      options:NSRegularExpressionCaseInsensitive
                                                                        error:&error];

Я также хотел бы, чтобы обнаруженный идентификатор был ссылкой, которая отправляет UIWebView с комбинацией URL + ID (http://www.stack.com?id) в стек навигации. Должен быть только один идентификатор. Любые идеи?

Спасибо!


person 4m1r    schedule 15.08.2014    source источник


Ответы (2)


Это заняло у меня целый день, и я, наконец, нашел и модифицировал это решение Рэя Вендерлиха. По-видимому, это довольно непонятная новая функция в iOS 7.

- (NSAttributedString *)makeAttributedAbstract:(NSString*)str
{
    NSMutableAttributedString *mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:str];

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(PMID: [0-9]+)" options:kNilOptions error:nil];

    NSRange range = NSMakeRange(0, str.length);

    [regex enumerateMatchesInString:str options:kNilOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
        NSRange subStringRange = [result rangeAtIndex:1];
        [mutableAttributedString addAttribute:NSLinkAttributeName value:@"pmid://" range:subStringRange];
    }];

    return (NSAttributedString*)mutableAttributedString;
}


- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    if ([[URL scheme] isEqualToString:@"pmid"]) {

        NSString *pmid = [NSString stringWithFormat:@"http://www.ncbi.nlm.nih.gov/pubmed/%@", [self.sql getPmidForId:self.abstractId] ];

        NSURL *url = [NSURL URLWithString:pmid];
                NSLog(@"pmid: %@", url);
        [self pushWebViewWithURL:url];

        return NO;
    }
    return YES; // let the system open this URL
}

http://www.raywenderlich.com/48001/easyly-overlooked-new-features-ios-7#textViewLinks

person 4m1r    schedule 16.08.2014

Я думаю, вам нужно обойти эту проблему, потому что NSDataDetector ограничен пресетами.

Посмотрите на этот ответ https://stackoverflow.com/a/19397842/2085504

person deramko    schedule 15.08.2014