6

現在、リンクをクリック可能にするために を使用してUITextViewUITableViewCellますが、パフォーマンスが非常に低下しています。

でリンクを検出できるかどうか疑問に思っていました。NSStringリンクがある場合は を使用しUITextView、それ以外の場合は を使用しUILabelます。

4

3 に答える 3

16

絶対。NSDataDetectorを使用する(NSDataDetectorクラスリファレンス

于 2012-06-13T08:59:46.043 に答える
2

URLを検出するための正規表現に精通していると思います。そのため、セルでいずれかのタイプのビューを取得するには、メソッドUITableViewCellから2つの異なるを返すだけです。tableView:cellForRowAtIndexPath:

これは次のようになります(テストされていないブラウザに入力されていることに注意してください)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *dataString = // Get your string from the data model

    // Simple pattern found here: http://regexlib.com/Search.aspx?k=URL
    NSString *URLpattern = @"^http\\://[a-zA-Z0-9\-\.]+\\.[a-zA-Z]{2,3}(/\\S*)?$";

    NSError *error = NULL;
    NSRegularExpression *URLregex = [NSRegularExpression regularExpressionWithPattern:URLpattern
                                                                              options:NSRegularExpressionCaseInsensitive
                                                                                error: &error];

    NSUInteger numberOfMatches = [URLregex numberOfMatchesInString:string
                                                    options:0
                                                      range:NSMakeRange(0, [string length])];

    if ( numberOfMatches == 0 ) {
        static NSString *PlainCellIdentifier = @"PlainCellIdentifier";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
        }
        cell.textLabel.text = timeZoneWrapper.localeName;
    }
    else {
        static NSString *FancyCellIdentifier = @"FancyCellIdentifier";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
        }

        // Configure cell view with text view here
    }

    return cell;
}
于 2012-06-13T09:01:04.780 に答える