动弹

2016-11-03

TweetTableViewController类:
此类继承自OSCObjsViewController,而OSCObjsViewController继承自UITableViewController。
问题:

  1. _textView属性的作用。
    经过试验验证,此属性可以去掉。

动弹JSON数据格式

{
    "code": 1,
    "message": "SUCCESS",
    "result":{...
     },
       "time": "2016-11-03 21:07:21"
}

code :

1 表示热门动弹
2 表示最新动弹
3 具体用户的id则是获取这个用户的动弹列表

message:

 是否成功

result:

 返回的动弹数据
            "appClient": 3,
            "author": {
                "id": 1761914,
                "name": "流年浅夏",
                "portrait": "http://static.oschina.net/uploads/user/880/1761914_50.jpg?t=1470725915000"
            },
            "commentCount": 0,
            "content": "我每天都能發動彈,可我就是買不起房。 ",
            "href": "https://my.oschina.net/das/tweet/10968283",
            "id": 10968283,
            "images": [{
                "h": 414,
                "href": "http://static.oschina.net/uploads/space/2016/1103/210236_nlL1_1761914.jpg",
                "name": "210236_nlL1_1761914",
                "thumb": "http://static.oschina.net/uploads/space/2016/1103/210236_nlL1_1761914_thumb.jpg",
                "type": "jpg",
                "w": 434
            }],
            "likeCount": 1,
            "liked": false,
            "pubDate": "2016-11-03 21:02:34"

说明:
- appclient 动弹来源客户端类型
- author 动弹的作者
|-- id:作者id
|-- name:作者昵称
|-- portrait:作者头像地址
- commentCount 动弹评论数量
- content 动弹的内容
- href 动弹的连接,单击此动弹后跳转到位置
- id 动弹的id
- images 动弹内容中有图片
|-- h:图片高度
|-- href: 大图片地址
|-- name:图片名称
|-- thumb:缩略图地址
|-- type: 图片类型
|-- w: 图片宽度
- likeCount 动弹的点赞数量
- liked 是否已经对该动弹点赞
- pubDate 动弹发布日期

time:

请求时间

2016-11-04

OSCTweetItem类:
主要是动弹数据,是一个Model

此Model中有2个setter方法:

  1. -(void)setContent:(NSString *)content; 主要是用于根据content内容设置textField frame的大小.

其中用到NSString的一个实例方法。

//主要根据给定的size, 属性来生成一个CGRect
- (CGRect)boundingRectWithSize:(CGSize)size  
                       options:(NSStringDrawingOptions)options  
                    attributes:(NSDictionary<NSString *,id> *)attributes  
                       context:(NSStringDrawingContext *)context;
  1. -(void)setImages:(NSArray<OSCTweetImages *> *)images;根据图片的数量设置图片显示的frame

Cell

主要根据是否有图片来确定返回的cell类型。一共有3中CELL

  1. OSCTextTweetCell 没有图片的CELL,只有文本信息
  2. OSCImageTweetCell 有一张图片的CELL
  3. OSCMultipleTweetCell 有多张图片的CELL

上述3种CELL都继承自AsyncDisplayTableViewCell
先看一下AsyncDisplayTableViewCell
这个类中定义了5个协议, CODE如下:

//用户头像被点击
- (void)userPortraitDidClick:(__kindof AsyncDisplayTableViewCell* )cell;

//改变动弹状态,如点赞,目前只是实现了此功能
- (void)changeTweetStausButtonDidClick:(__kindof AsyncDisplayTableViewCell* )cell;

- (void)shouldInteractTextView:(UITextView* )textView
                           URL:(NSURL *)URL
                       inRange:(NSRange)characterRange;

- (void)textViewTouchPointProcessing:(UITapGestureRecognizer* )tap;

@optional   //可选协议,对于有图片的动弹,点击图片会加载大图片。
- (void)loadLargeImageDidFinsh:(__kindof AsyncDisplayTableViewCell *)cell
                photoGroupView:(OSCPhotoGroupView *)groupView
                      fromView:(UIImageView *)fromView;

2016-11-06

坑1,pageToken 干什么用的。

填坑:通过抓包发现pageToken其实相当请求了不同的页面
pageToken=&type=2请求的是热门动弹
pageToken=&type=1请求的是最新动弹

坑2, 动弹的cell没有注册就可以dequeueReusableCellWithIdentifier:?

填坑

复用cell有两种方法:
//这种是老方法,返回值需要判断是否为nil,不需要提前注册

  • (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
    //iOS6之后添加的,需要提前注册。
  • (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
    //注册方法有可以通过nib或Class
  • (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier;
  • (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier;

再读AsyncDisplayTableViewCell类。
*- (void)handleTextView:(UITextView )textView 用与Cell中的UITextView设置复制,拷贝菜单的显示如图:

Paste_Image.png

覆盖了UIPasteboard的2个方法,用于实现自定的menu,上图中的复制就是自定义的菜单。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    return _canPerformAction(self, action);
}
- (BOOL)canBecomeFirstResponder
{
    return YES;
}

这个类中还处理了一些动弹中的图片设置,如点赞图片,回复图片。

OSCTextTweetCell

此类使用了YYKit,来制作一些文字效果。

以下是此类中声明的变量,YYLabel就YYKit中的一个控件。

@interface OSCTextTweetCell ()<UITextViewDelegate>{
    __weak UIImageView* _userPortrait ;
    __weak YYLabel* _nameLabel;
    __weak UITextView* _descTextView;
    __weak YYLabel* _timeAndSourceLabel;
    __weak UIImageView* _likeCountButton;
    __weak YYLabel* _likeCountLabel;
    __weak UIImageView* _commentCountBtn;
    __weak YYLabel* _commentCountLabel;
    __weak CALayer* _colorLine;
}
@end

坑3. CELL中的布局使用是原生的布局方式or第三方扩展方式?代码如下:

_userPortrait.size = (CGSize){userPortrait_W,userPortrait_H};
_userPortrait.left = padding_left;
_userPortrait.top = padding_top;

填坑

上述代码使用的是第三方进行的布局设置YYKit,定义了UIView的分类。

- (void)prepareForReuse; 重用操作在对cell进行复用是会自动调用此方法。

2016-11-12

UIPasteboard

相当于粘贴板,用于本APP的数据交换或其他APP可以使用从本APP中复制的一些数据。
粘贴板又分为系统级和app级别,系统级可以整个系统内都可以使用,比如我们在微博中复制了一段文字,使用Safari进行搜索。
app级别相当于自定义的一个UIMenuItem,将相应的方法添加到
UIMenuController中,如下代码:

 UIMenuController *menuController = [UIMenuController sharedMenuController];
    
    [menuController setMenuVisible:YES animated:YES];
    [menuController setMenuItems:@[
                                   [[UIMenuItem alloc] initWithTitle:@"复制" action:NSSelectorFromString(@"copyText:")],   //设置自定义的方法--“copyText:”和显示的名字--“复制”
                                   [[UIMenuItem alloc] initWithTitle:@"删除" action:NSSelectorFromString(@"deleteObject:")]
                                   ]];

挖坑:

  • 坑1 在tableView中如何实现长按某一个cell,弹出自定义的menu.

填坑:

 先了解一下基础知识:

剪贴板类型:

系统级别:使用UIPasteboardNameGeneral和UIPasteboardNameFind,系统级应用程序关闭,或者卸载的数据不会丢失。
应用程序级:通过设置,可以让数据在应用程序关闭之后仍然保存在剪贴板中,但是应用程序卸载之后数据就会失去。我们可用通过pasteboardWithName:create:来创建。

在ios中,支持UIPasteboard原生控件只有UITextField 、UITextView、UIWebView这三个,如果想自定义一个控件能够使用UIPasteboard,需要在定义的时候重载一下两个方法:

-(BOOL)canBecomeFirstResponder //设置为第一响应者
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
/*****
决定这个控件能够使用复制、剪切、选中、全选、粘贴等的哪一种或几种功能,并重载对应的-(void)copy:(id)sender、-(void)cut:(id)sender、-(void)select:(id)sender、-(void)selectAll:(id)sender、-(void)paste:(id)sender方法,在这几个方法中处理事件,UIMenuController负责显示UI。
*****/

针对自定义的menu上个例子说明一下:
1 在AppDelegate.m文件中加入一下方法:

UIMenuController *menuController = [UIMenuController sharedMenuController];

 [menuController setMenuVisible:YES animated:YES];
 [menuController setMenuItems:@[
           [[UIMenuItem alloc] initWithTitle:@"myCopy"
                 action:NSSelectorFromString(@"copyText:")]
           ]]; //将自己定义的菜单添加到sharedMenuController中,名字为myCopy,对应的方法为copyText:

2 在需要自定义的控件中重载UIPasteboard的2个方法,本栗子是在自定义的cell中进行重载的。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
 if (action == @selector(copyText:)) {
  return YES;
 };
 
 return NO;
}
- (BOOL)canBecomeFirstResponder
{
 return YES;
}

3 实现copyText:方法

- (void)copyText:(id)sender{
 NSLog(@"执行copyText");
}

4 实现效果:


自定义cell.png

2016-11-15

很悲催,到现在动弹页面还没搞定,呜呜。
接着挖坑
坑1,动弹中有3个子页面包括,“最新动弹”,“热门动弹”,“我的动弹”如何实现。

2016-11-16

动弹详情控制器:TweetDetailNewTableViewController
1,动弹详情中的点赞列表和评论列表之间的切换怎么重新加载数据的,reloadData?
确实执行了reloadData,记得reloadData有性能的影响。
1.1 tableView中的reloadData的性能?
2,动弹详情页面push时传递了什么参数?
这个视图不是直接被push出来的,而是作为TweetDetailsWithBottomBarViewController的子控制器进行处理
从动弹列表中跳转到动弹详情代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    OSCTweetItem *tweet = self.dataModels[indexPath.row];
    
    TweetDetailsWithBottomBarViewController *tweetDetailsBVC = [[TweetDetailsWithBottomBarViewController alloc] initWithTweetID:tweet.id];
    [self.navigationController pushViewController:tweetDetailsBVC animated:YES];
}

push是使用的tweet.id进行数据传递的,TweetDetailsWithBottomBarViewController 在加载TweetDetailNewTableViewController控制器时将tweet.id进行正向传值,TweetDetailNewTableViewController通过此ID进行网络数据请求从而进行相应的Cell设置。

3,TweetDetailsWithBottomBarViewController类的功能?

逻辑图.png

2016-11-17

1,如何使一个子类必须覆盖父类中某一个方法?
在父类方法中使用断言来提示NSAssert(false, @"over ride subclass");不过此方法只能在运行时才会被发现。

2,看一下网易新闻客户端的结构。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容