2016-11-03
TweetTableViewController类:
此类继承自OSCObjsViewController,而OSCObjsViewController继承自UITableViewController。
问题:
- _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方法:
- -(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;
- -(void)setImages:(NSArray<OSCTweetImages *> *)images;根据图片的数量设置图片显示的frame
Cell
主要根据是否有图片来确定返回的cell类型。一共有3中CELL
- OSCTextTweetCell 没有图片的CELL,只有文本信息
- OSCImageTweetCell 有一张图片的CELL
- 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设置复制,拷贝菜单的显示如图:
覆盖了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 实现效果:
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类的功能?
2016-11-17
1,如何使一个子类必须覆盖父类中某一个方法?
在父类方法中使用断言来提示NSAssert(false, @"over ride subclass");
不过此方法只能在运行时才会被发现。
2,看一下网易新闻客户端的结构。