iOS开发之新浪微博山寨版代码优化

之前发表过一篇博客“IOS开发之新浪围脖”,在编写代码的时候太偏重功能的实现了,写完基本功能后看着代码有些别扭,特别是用到的四种cell的类,重复代码有点多,所以今天花点时间把代码重构一下。为了减少代码的重复编写把cell中相同的部分抽象成父类,然后继承。不过也是结合着storyboard做的。在优化时转发的View和评论的View相似,于是就做了个重用。在原来的代码上就把cell的代码进行了重写,所以本篇作为补充,关键代码还得看之前的博客。

  1.第一种cell,只有微博内容,没有图片,效果如下:

  cell对应的代码如下:

  TextTableViewCell.h

 1 #import
 2
 3 //TableView要回调的block,用于把cell中的按钮的tag传给TableView
 4 typedef  void (^MyCellBlock) (UITableViewCell * cell, int tag);
 5
 6 @interface TextTableViewCell : UITableViewCell
 7 //接收block块
 8 -(void)setMyCellBlock:(MyCellBlock) block;
 9
10 //接收字典
11 -(void) setDic:(NSDictionary *)dic;
12
13 @end

  TextTableViewCell.m(带图片的cell继承于这个cell)

 1 #import "TextTableViewCell.h"
 2
 3 @interface TextTableViewCell()
 4
 5 @property (strong, nonatomic) IBOutlet UIImageView *headImage;
 6 @property (strong, nonatomic) IBOutlet UILabel *nameLabel;
 7 @property (strong, nonatomic) IBOutlet UILabel *dateLabel;
 8 @property (strong, nonatomic) IBOutlet UILabel *weiboTextLabel;
 9
10 @property (strong, nonatomic) NSDictionary *dic;
11 @property (strong, nonatomic) MyCellBlock block;
12
13 @end
14
15 @implementation TextTableViewCell
16
17 //获取传入的block块
18 -(void)setMyCellBlock:(MyCellBlock)block
19 {
20     self.block = block;
21 }
22
23 //获取传入的参数,用于给我们的cell中的标签赋值
24 -(void) setDic:(NSDictionary *)dic
25 {
26
27     //设置头像
28    [self.headImage setImageWithURL:[NSURL URLWithString:dic[@"user"][@"profile_image_url"]]];
29
30     //设置昵称
31     self.nameLabel.text = dic[@"user"][@"name"];
32
33     //设置时间
34     NSDateFormatter *iosDateFormater=[[NSDateFormatter alloc]init];
35     [email protected]"EEE MMM d HH:mm:ss Z yyyy";
36
37     //必须设置,否则无法解析
38     iosDateFormater.locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"];
39    NSDate *date=[iosDateFormater dateFromString:dic[@"created_at"]];
40
41      //目的格式
42      NSDateFormatter *resultFormatter=[[NSDateFormatter alloc]init];
43      [resultFormatter setDateFormat:@"MM月dd日 HH:mm"];
44     self.dateLabel.text = [resultFormatter stringFromDate:date];
45
46     //设置微博博文
47     self.weiboTextLabel.text = dic[@"text"];
48
49 }
50
51
52 //通过block回调来返回按钮的tag
53 - (IBAction)tapCellButton:(id)sender {
54     UIButton *button = sender;
55     self.block(self, button.tag);
56 }
57
58 - (void)awakeFromNib
59 {
60     // Initialization code
61 }
62
63 - (void)setSelected:(BOOL)selected animated:(BOOL)animated
64 {
65     [super setSelected:selected animated:animated];
66
67     // Configure the view for the selected state
68 }
69
70 @end

  2、上面的代码有点多,如果我们再加第二个cell(原微博带图片的)就简单多了,可以继承与上面的cell

  

  ImageTableViewCell.m的代码如下:(只把要添加的东西加上即可,是不是代码少多了)

@interface ImageTableViewCell()
@property (strong, nonatomic) IBOutlet UIImageView *contentImage;

@end

@implementation ImageTableViewCell
-(void)setDic:(NSDictionary *)dic
{
    [super setDic:dic];
    [self.contentImage setImageWithURL:[NSURL URLWithString:dic[@"thumbnail_pic"]]];
}
@end

  3.第三种cell,是转发微博不带图片的,如下:

   ReTextTableViewCell也是继承于TextTableViewCell.  ReTextTableViewCell.m的代码如下:

 1 @interface ReTextTableViewCell ()
 2 @property (strong, nonatomic) IBOutlet UILabel *weiboTextLabel;
 3 @property (strong, nonatomic) IBOutlet NSLayoutConstraint *textHeightConstraint;
 4
 5 @property (strong, nonatomic) IBOutlet UITextView *reTextView;
 6
 7 @end
 8
 9 @implementation ReTextTableViewCell
10
11 -(void)setDic:(NSDictionary *)dic
12 {
13     [super setDic:dic];
14     //移除约束
15     [self removeConstraint:self.textHeightConstraint];
16
17     //给据text的值求出textLabel的高度
18     NSString *text = dic[@"text"];
19     NSDictionary * dic1 = @{NSFontAttributeName: [UIFont systemFontOfSize:14]};
20
21     CGRect frame = [text boundingRectWithSize:CGSizeMake(260, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic1 context:nil];
22
23     //创建新的约束
24     NSString *heightValue = [NSString stringWithFormat:@"V:[_weiboTextLabel(%lf)]",frame.size.height+10];
25     NSArray *constraint = [NSLayoutConstraint constraintsWithVisualFormat:heightValue options:0 metrics:nil views:NSDictionaryOfVariableBindings(_weiboTextLabel)];
26
27     self.textHeightConstraint = constraint[0];
28     [self addConstraint:self.textHeightConstraint];
29
30     self.weiboTextLabel.text = text;
31
32     self.reTextView.text = dic[@"retweeted_status"][@"text"];
33
34 }
35 @end

  4.第四种cell就是转发带图片的啦,效果如下:

  因为第四种cell只比第三种cell多啦张图片,所以继承于第三种cell即可,代码如下:

#import "ReImageTableViewCell.h"

@interface ReImageTableViewCell()

@property (strong, nonatomic) IBOutlet UIImageView *contentImageView;

@end

@implementation ReImageTableViewCell

-(void)setDic:(NSDictionary *)dic
{
    [super setDic:dic];
    [self.contentImageView setImageWithURL:[NSURL URLWithString:dic[@"retweeted_status"][@"thumbnail_pic"]]];
}

@end

  来看一下最终的运行效果:

  由上面的界面可以清楚的看到转发和评论的界面是基本一致的,所以我们在代码中可以用一个ViewController来控制这个视图,通过点击不同的按钮来拼接不同的url. 选择的业务逻辑如下:

1     if ([self.tag isEqualToValue:@2])
2     {
3         [self post:comments_create Content:@"comment"];
4     }
5     if ([self.tag isEqualToValue:@1])
6     {
7         [self post:repost_test Content:@"status"];
8     }

  在转发页面中用到啦一个TextView, 我们给键盘上添加了一个Toolbar来进行键盘的回收,代码如下:

1     //TextView的键盘定制回收按钮
2     UIToolbar * toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];
3
4     UIBarButtonItem * item1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(tapDone:)];
5     UIBarButtonItem * item2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
6     UIBarButtonItem * item3 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
7     toolBar.items = @[item2,item1,item3];
8
9     self.commentsTextView.inputAccessoryView =toolBar;

  在要回调的方法中回收键盘:

1 - (IBAction)tapDone:(id)sender {
2     [self.commentsTextView resignFirstResponder];
3 }
时间: 2024-08-12 16:13:59

iOS开发之新浪微博山寨版代码优化的相关文章

IOS开发之新浪微博OAuth2

说明:微博开放接口的调用,如发微博.关注等,都是需要获取用户身份认证的.目前微博开放平台用户身份鉴权主要采用的是OAuth2.0.为了方便开发者开发.测试自己的应用. OAuth2.0较1.0相比,整个授权验证流程更简单更安全,也是未来最主要的用户身份验证和授权方式. 步骤一:创建应用 下面我以本公司测试账号为例,创建应用步骤可以参考新浪的官方API 地址:http://open.weibo.com应用创建好停留在开发阶段即可使用,本例的应用信息如下图 步骤二:获取token号码 通过webVi

iOS开发>学无止境 - 新浪微博iOS底部功能按钮简单实现

以上效果主要涉及点 九宫格布局 形变动画 UIView动画 首先,考虑图片的效果,初步采用使用modal控制器来实现,但是考虑到modal最后会移除modal他的控制器的view,所以,还是使用自定义UIView来实现这个功能. 做这种功能,首先实现的是按钮出现位置,后面在实现动画就容易了. 首先进行九宫格布局,创建模型传入指定数量的按钮,并且使用形变,将所有的按钮移动到看不见的坐标 点击底部按钮后,设置形变至屏幕区域(这里直接设置成CGAffineTransformIdentity) 对功能按

IOS开发之微信山寨版

为了犒劳自己的学习内容,就山寨个微信的视图控制吧.拿着微信,仔细的看了一下,主要用到了TabBarController以及配置TabBarItem, NavigationController以及配置NavigationBarItem, 还用到了我们比较复杂的TableViewController来显示我们的数据.在用到TableView中既有静态的TableView,也有动态的TableView.动态的TableView主要用来显示我们的数据,而静态的TableView主要用来显示功能模块导航时

我的iOS开发系列博文

之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关iOS开发的内容,有初级部分也有高级部分,有旧的东西,也有新的东西.咸蛋就先扯到这儿,正文走起: 我的iOS系列博文如下:   01.iOS开发之简单音频播放器 02.iOS开发之视图和视图控制器 03.iOS开发之绝对布局和相对布局(屏幕适配) 04.iOS开发之自动布局显示网络请求内容 05.i

iOS开发之山寨版新浪微博小结

在之前的博客IOS开发之新浪围脖中获取微博的内容是使用我自己的access_token来请求的数据,那么如何让其他用户也能登陆并获取自己的微博内容呢?接下来就是OAuth和SSO出场的时候啦.OAuth的全称为Open Authorization 开发授权,SSO--单点登陆(Single Sign On).至于其原理是什么,更具体的介绍网上的资料是一抓一大把,在这就不做过多的原理性的概述.当然啦,OAuth和SSO在Web和其他手机终端上应用还是蛮多的,所有这方面的资料也是多的很. 简单的说就

iOS开发之微信聊天工具栏的封装(走过路过不要错过哦)

之前山寨了一个新浪微博(iOS开发之山寨版新浪微博小结),这几天就山寨个微信吧.之前已经把微信的视图结构简单的拖了一下(IOS开发之微信山寨版),今天就开始给微信加上具体的实现功能,那么就先从微信的聊天界面开始吧.提到封装是少不了写代码的,在封装组件的时候,为了组件的可移植性,我们就不能用storyboard来拖拽了.为了屏幕的适配,适应不同屏幕的手机,所以在封装组件的时候是少不了为我们的组件来添加约束.今天博客中的所有代码都是脱离storyboard的,这些代码在别的工程中也是可以使用的.好,

在地下室开发IOS版的新浪微博

我开发的新浪微博sina,我为自己代言! IOS开发的sina客户端 为了学习IOS,我辞职了,一个月的时间,我从C语言开始学起,早晨8点,到晚上12点,几乎每天都是这样,日复一日. 总是忘记了去吃中午饭,记得那个时候,我住在北京的一个地下室里,每天看不到阳光,其实也好,刚好是三伏天,出门去挺热的,在家学习也不错,嘿嘿!每天中午,总是被一个问题磕磕绊绊,总是忘记去吃中午饭,每当我能解决到一个问题,心中都特别的兴奋!这时候才想到,我原来有点饿了!接着就去到外面找饭吃,每次都是去一个地下餐馆,简简单

iOS开发项目-02添加子控制器以及项目分层

iOS开发项目-02添加子控制器以及项目分层 一.添加子控制器 1.设置根控制器(自定义) 说明:分析新浪微博应用,观察其整体建构层次.而系统的控制器不能满足项目开发的需求,这里把项目中原有的控制器删除. 自己定义一个TabBarViewController类.让这个类作为window窗口的根控制器. YYAppDelegate.m文件代码: 1 #import "YYAppDelegate.h" 2 #import "YYTabBarViewController.h&quo

iOS开发-二维码扫描和应用跳转

iOS开发-二维码扫描和应用跳转 序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar.使用时集成麻烦,出错也不方便调试.在iOS7之后,苹果自身提供了二维码的扫描功能,从效率上来说,原生的二维码远高于这些第三方框架.本文讲解如何使用原生框架实现二维码扫描功能,并且进行扫描后的项目跳转.ps:本期的源代码会在文章结尾给出链接 扫描相关类 二维码扫描需要获取摄像头并读取