今天主要完成评论界面模块:
该界面的思路如下:
接下来说明具体实现!
/** * cell右上角按钮点击 */
- (IBAction)more
{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:(UIAlertControllerStyleActionSheet)];
UIAlertAction *cancleAction = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:nil];
UIAlertAction *collectAction = [UIAlertAction actionWithTitle:@"收藏" style:(UIAlertActionStyleDefault) handler:nil];
UIAlertAction *reportAction = [UIAlertAction actionWithTitle:@"举报" style:(UIAlertActionStyleDefault) handler:nil];
[alertController addAction:cancleAction];
[alertController addAction:collectAction];
[alertController addAction:reportAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
/** * 初始化设置 */
- (void)setupBasic
{
self.title = @"评论";
self.navigationItem.rightBarButtonItem = [UIBarButtonItem itemWithImage:@"comment_nav_item_share_icon" highImage:@"comment_nav_item_share_icon_click" target:self action:@selector(rightBarButtonItemClick)];
// 设置主题色
self.tableView.backgroundColor = DSThemeColor;
}
在setupBasic方法里面监听:
// 监听键盘frame的改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
/** * 监听键盘改变的通知方法 */
- (void)keyboardWillChangeFrame:(NSNotification *)notification
{
// 获取键盘的frame
CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
// 修改工具条距离底部的间距
self.bottomSpace.constant = DSScreenH - keyboardFrame.origin.y;
// 动画时间
CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// 动画
[UIView animateWithDuration:duration animations:^{
[self.view layoutIfNeeded];
}];
}
/** * 刚开始拖拽的时候就退出键盘 */
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self.view endEditing:YES];
}
这个部分其实用tableview的tableHeaderView来显示就可以了,而不必用自定义cell!而且由于tableHeaderView比较特殊,所以我们对它进行一层包装,用一个UIView包住子控件!
/** * 设置headerView */
- (void)setupHeader
{
UIView *header = [[UIView alloc] init];
DSTopicCell *cell = [DSTopicCell cell];
cell.topic = self.topic;
cell.size = CGSizeMake(DSScreenW, self.topic.cellHeight);
[header addSubview:cell];
header.height = self.topic.cellHeight + DSTopicCellMargin;
self.tableView.tableHeaderView = header;
}
创建首页cell,然后传递模型,接着设置frame后添加到header里面。这样一点击首页cell,里面就直接可以显示上图所示头部界面了,因为具体的cell实现已经完成!
这个分组的头部标题显示本来直接实现titleForHeaderInSection方法就可以的,但是这样显示出来的标题非常难看,不符合需求。其实还有另外一个方法viewForHeaderInSection,这个是返回一个UIView,所以我们可以自定义headerView来显示,里面添加一个label就可以了!
这是最热评论和最新评论的数组模型!
/** * 最热评论 */
@property (nonatomic, strong) NSArray *hotComments;
/** * 最新评论 */
@property (nonatomic, strong) NSMutableArray *latestComments;
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
DSCommentHeaderView *header = [DSCommentHeaderView headerViewWithTableView:tableView];
NSInteger hotCount = self.hotComments.count;
if (section == 0) { // 判断第0组是不是最热评论
header.title = hotCount ? @"热门评论" : @"最新评论";
}else {
header.title = @"最新评论";
}
return header;
}
DSCommentHeaderView.m就不在重复了,无非是设置模型,init方法创建子控件,然后提供类方法创建自定义cell!
这个界面也不想再做过多的解析!主要说下其中一些注意点!
// cell的高度(首先告诉估算高度,然后自动计算尺寸)
self.tableView.estimatedRowHeight = 44;
self.tableView.rowHeight = UITableViewAutomaticDimension;
// 结束之前的所有请求(还能开启任务,取消就会默认调用之前请求的failure这个Block代码)
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
在控制器销毁时,也是清除所有网络请求,但是这次不一样,应该取消所有网络任务后,不能再开启任务!
这句代码在dealloc方法中完成:
// 取消所有任务(不能再开启任务)
[self.manager invalidateSessionCancelingTasks:YES];