首页 > 代码库 > 新浪微博客户端(55)-高亮显示微博内容中的昵称,话题,超链接

新浪微博客户端(55)-高亮显示微博内容中的昵称,话题,超链接

DJStatus.h

#import <Foundation/Foundation.h>

@class DJUser;

/** 微博 */
@interface DJStatus : NSObject

/** 微博id */
@property (nonatomic,copy) NSString *idstr;
/** 微博内容 */
@property (nonatomic,copy) NSString *text;
/** 微博内容(带属性) */
@property (nonatomic,copy) NSAttributedString *attributedText;
/** 微博关联用户 */
@property (nonatomic,strong) DJUser *user;
/** 发布日期 */
@property (nonatomic,copy) NSString *created_at;
/** 来源 */
@property (nonatomic,copy) NSString *source;
/** 配图 */
@property (nonatomic,strong) NSArray *pic_urls;
/** 转发微博 */
@property (nonatomic,strong) DJStatus *retweeted_status;
/** 转发微博(带属性) */
@property (nonatomic,copy) NSAttributedString *retweetedAttributedText;
/** 转发数 */
@property (nonatomic,assign) int reposts_count;
/** 评论数 */
@property (nonatomic,assign) int comments_count;
/** 表态数 */
@property (nonatomic,assign) int attitudes_count;


@end

DJStatus.m

// 设置带属性的文本内容
- (void)setText:(NSString *)text {

    _text = text;
    
    // 将微博内容文本转换为带属性的微博内容文本
    _attributedText = [self attributedTextWithText:text];

}



- (void)setRetweeted_status:(DJStatus *)retweeted_status {

    _retweeted_status = retweeted_status;
    
    DJUser *retwetedUser = retweeted_status.user;
    NSString *retweetedText = [NSString stringWithFormat:@"@%@: %@",retwetedUser.name,retweeted_status.text];
    
    _retweetedAttributedText = [self attributedTextWithText:retweetedText];
    
}



/** 普通文本->属性文本 */
- (NSAttributedString *)attributedTextWithText:(NSString *)text {
    
    // 表情的规则
    NSString *emotionPattern = @"\\[[0-9a-zA-Z\\u4e00-\\u9fa5]+\\]";
    // @的规则
    NSString *atPattern = @"@[0-9a-zA-Z\\u4e00-\\u9fa5-_]+";
    // #话题#的规则
    NSString *topicPattern = @"#[0-9a-zA-Z\\u4e00-\\u9fa5]+#";
    // url链接的规则
    NSString *urlPattern = @"\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))";
    NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@|%@", emotionPattern, atPattern, topicPattern, urlPattern];
    
    // 利用当前文本生成attributedText
    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:text];
    
    // 遍历所有特殊字符串
    [text enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
        // !注意: 此处block里回传的是NSRange的指针变量,需要通过*capturedRanges取出对应的NSRange
        [attributedText addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:*capturedRanges];
        
    }];
    
    return attributedText;
    
}

DJStatusCell.m

- (void)setStatusFrame:(DJStatusCellFrame *)statusFrame {
      // 微博内容
    self.contentLabel.frame = statusFrame.contentLabelF;
//    self.contentLabel.text = status.text;
    self.contentLabel.attributedText = status.attributedText;

 /* 转发微博 */
    DJStatus *retweetedStatus = status.retweeted_status;
    if (retweetedStatus) { // 如果有转发微博
        self.retweetView.hidden = NO;
//        DJUser *retwetedUser = retweetedStatus.user;
        
        // 转发微博内容
        self.retweetContentLabel.frame = statusFrame.retweetContentLabelF;
//        self.retweetContentLabel.text = [NSString stringWithFormat:@"@%@: %@",retwetedUser.name,retweetedStatus.text];
        self.retweetContentLabel.attributedText = status.retweetedAttributedText;
        
        // 转发微博相册
        if (retweetedStatus.pic_urls.count) { // 如果有微博相册
            self.retweetPhotosView.hidden = NO;
            self.retweetPhotosView.frame = statusFrame.retweetPhotosViewF;
            self.retweetPhotosView.photos = retweetedStatus.pic_urls;
        } else { // 没有微博配图
            self.retweetPhotosView.hidden = YES;
        }
        // 转发微博整体
        self.retweetView.frame = statusFrame.retweetViewF;
        
    } else { // 如果没有转发微博
        self.retweetView.hidden = YES;
    }
  

}

集成RegexKitLite框架

1. 添加RegexKitLite的库文件到项目:

技术分享

2. 如果此时执行Command+B编译,Xcode会报错:

技术分享

3. 错误的原因是RegexKitLite框架是非ARC的代码,因此我们需要在Xcode中指定RegexKitLite为非ARC

技术分享

 

4. 完成上述操作后再次编译,发现还是报错,这是因为RegexKitLite依赖于libicucore.dylib这个动态库,因此我们在Xcode中添加这个库

技术分享

技术分享

5. 完成上述操作后,再次编译,同时在需要使用这个库的.m文件中导入RegexKitLite的头文件“RegexKitLite.h”,发现已经可以正常使用了

技术分享

 

最终效果:

技术分享

 

新浪微博客户端(55)-高亮显示微博内容中的昵称,话题,超链接