Files
ifish/Ifish/UMCommunity/UMCommunitySDK/UMCommunityUI/Common/BaseVC/UMComRequestTableViewController.m
T
2017-08-15 16:59:01 +08:00

425 lines
14 KiB
Objective-C

//
// UMComRequestTableViewController.m
// UMCommunity
//
// Created by umeng on 15/11/16.
// Copyright © 2015年 Umeng. All rights reserved.
//
#import "UMComRequestTableViewController.h"
#import "UMComScrollViewDelegate.h"
#import "UIViewController+UMComAddition.h"
#import <UMCommunitySDK/UMComSession.h>
#import "UMComShowToast.h"
#import "UMComRefreshView.h"
#import <UMComFoundation/UMComKit+Color.h>
typedef NS_ENUM(NSInteger, UMComVisitType){
UMComVisitType_None = -1, //< 初始化状态
UMComVisitType_VisitNeedLoginForMoreData = 0, //< 需要登录才能访问更多数据
UMComVisitType_VisitNeedLoginForNoMoreData = 1, //< 需要登录访问,但是没有下一页数据
UMComVisitType_Visit = 2, //< 可以访问(目前没有用到,UMComVisitType_VisitForMoreData和UMComVisitType_VisitForNoMoreData都可以表示可以访问)
UMComVisitType_VisitForMoreData = 3, //< 可以访问下一页数据
UMComVisitType_VisitForNoMoreData = 4 //< 可以访问没有下一页数据
};
@interface UMComRequestTableViewController ()<UITableViewDelegate, UITableViewDataSource, UMComScrollViewDelegate>
@property (nonatomic, assign) CGPoint lastPosition;
@property(nonatomic,assign)UMComVisitType visitMoreDataMode;
//检查是否访客模式
-(BOOL) canVisitNextPage;
-(void) refreshDataFromServer;
@end
@implementation UMComRequestTableViewController
- (instancetype)init
{
self = [super init];
if (self) {
[self initData];
}
return self;
}
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self initData];
}
return self;
}
- (void)initData
{
self.isLoadFinish = YES;
self.isAutoStartLoadData = YES;
self.visitMoreDataMode = UMComVisitType_None;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.isLoadFinish = YES;
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:self.tableView];
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) {
[self setEdgesForExtendedLayout:UIRectEdgeNone];
}
__weak typeof(self) weakSelf = self;
self.refreshHeadView = (UMComHeadView *)[UMComHeadView refreshControllViewWithScrollView:self.tableView block:^{
[weakSelf refreshData];
}];
self.refreshFootView = (UMComFootView *)[UMComFootView refreshControllViewWithScrollView:self.tableView block:^{
[weakSelf loadMoreData];
}];
self.tableView.separatorColor = UMComColorWithHexString(UMCom_Feed_BgColor);
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
self.scrollViewDelegate = self;
[self setForumUIBackButtonWithImage:UMComImageWithImageName(@"um_forum_back_gray")];
[self setForumUITitle:self.title];
[self updateTableviewConstraints];
}
- (void)updateTableviewConstraints
{
UITableView *tableView = self.tableView;
[tableView setTranslatesAutoresizingMaskIntoConstraints:NO];
NSDictionary *dict1 = NSDictionaryOfVariableBindings(tableView);
NSDictionary *metrics = @{@"hPadding":@0,@"topPadding":@0,@"vPadding":@0};
NSString *vfl = @"|-hPadding-[tableView]-hPadding-|";
NSString *vfl0 = @"V:|-topPadding-[tableView]-vPadding-|";
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vfl options:0 metrics:metrics views:dict1]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vfl0 options:0 metrics:metrics views:dict1]];
}
- (void)creatNoFeedTip
{
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height/2-40, self.view.frame.size.width,40)];
label.backgroundColor = [UIColor clearColor];
label.text = UMComLocalizedString(@"um_com_emptyData", @"暂时没有内容哦!");
label.font = UMComFontNotoSansLightWithSafeSize(17);
label.textColor = UMComColorWithHexString(FontColorGray);
label.textAlignment = NSTextAlignmentCenter;
label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
label.hidden = YES;
[self.view addSubview:label];
self.noDataTipLabel = label;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (!self.noDataTipLabel && self.doNotShowNodataNote == NO) {
[self creatNoFeedTip];
}
// 未登录时发送请求可能会不断收到未登录错误码而不断弹出登录
// 修改为第一次加载后开始手动下拉刷新加载
if (self.isAutoStartLoadData && self.isLoadFinish) {
[self refreshData];
self.isAutoStartLoadData = NO;
}else{
[self.tableView reloadData];
}
// //首先判断非访客模式===begin
// if (self.visitMoreDataMode == UMComVisitType_None) {
// //第一次进入的时候初始化为UMComVisitType_None的时候,表示未知状态,不需要判断其是否为访客模式,需要等到第一次网络请求到了,包含的访客模式(即为visitMoreDataMode赋非UMComVisitType_None的值)
// return;
// }
//
// //如果当前是访客模式即登录了,但是visitMoreDataMode为非访客模式,就需要修改其提示加载更多
// if ([self canVisitNextPage]) {
// if (self.visitMoreDataMode == UMComVisitType_VisitNeedLoginForMoreData)
// {
// //非访客模式直接显示加载更多
// [self.loadMoreStatusView setLoadStatus:UMComNoLoad];
// }
// else if (self.visitMoreDataMode == UMComVisitType_VisitNeedLoginForNoMoreData)
// {
// //非访客模式直接显示加载完成
// [self.loadMoreStatusView setLoadStatus:UMComFinish];
// }
// else if (self.visitMoreDataMode == UMComVisitType_VisitForMoreData)
// {
// [self.loadMoreStatusView setLoadStatus:UMComNoLoad];
// }
// else if (self.visitMoreDataMode == UMComVisitType_VisitForNoMoreData)
// {
// [self.loadMoreStatusView setLoadStatus:UMComFinish];
// }
// else{}
// }
// //首先判断非访客模式===end
}
////
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (self.dataController.dataArray.count > 0)//有数据
{
self.noDataTipLabel.hidden = YES;
}
else//数据为空
{
self.noDataTipLabel.hidden = NO;
}
return self.dataController.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellId = @"cellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}
return cell;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.isLoadFinish && self.scrollViewDelegate && [self.scrollViewDelegate respondsToSelector:@selector(customScrollViewDidScroll:lastPosition:)]) {
[self.scrollViewDelegate customScrollViewDidScroll:scrollView lastPosition:self.lastPosition];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
self.lastPosition = scrollView.contentOffset;
if (self.scrollViewDelegate && [self.scrollViewDelegate respondsToSelector:@selector(customScrollViewDidEnd:lastPosition:)]) {
[self.scrollViewDelegate customScrollViewDidEnd:scrollView lastPosition:self.lastPosition];
}
self.lastPosition = scrollView.contentOffset;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
// [self refreshScrollViewDidEndDragging:scrollView];
if (self.scrollViewDelegate && [self.scrollViewDelegate respondsToSelector:@selector(customScrollViewEndDrag:lastPosition:)]) {
[self.scrollViewDelegate customScrollViewEndDrag:scrollView lastPosition:self.lastPosition];
}
self.lastPosition = scrollView.contentOffset;
}
#pragma mark - refreshdelegate
- (void)refreshData:(UMComRefreshView *)refreshView
{
[self refreshData];
}
- (void)loadMoreData:(UMComRefreshView *)refreshView
{
[self loadMoreData];
}
#pragma mark - UMComRefreshTableViewDelegate
- (void) fetchLocalData
{
__weak typeof(self) weakSelf = self;
[self.dataController fetchLocalDataWithCompletion:^(NSArray *dataArray, NSError *error) {
if (dataArray && [dataArray isKindOfClass:[NSArray class]] && dataArray.count > 0) {
[weakSelf handleLocalData:dataArray error:error];
[weakSelf.tableView reloadData];
}
[weakSelf refreshDataFromServer];
}];
}
- (void)refreshData
{
if (self.dataController.isReadLoacalData) {
//设置NO只会第一次下拉刷新取本地数据
self.dataController.isReadLoacalData = NO;
//取本地数据的话,就不需要显示loadMoreStatusView的views
[self fetchLocalData];
}
else{
[self refreshDataFromServer];
}
}
-(void)refreshDataFromServer
{
if (!self.dataController) {
[self.refreshHeadView noMoreData];
return;
}
if (self.isLoadFinish == NO) {
return;
}
self.isLoadFinish = NO;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
__weak typeof(self) weakSelf = self;
[self.dataController refreshNewDataCompletion:^(NSArray *responseData, NSError *error) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[UMComShowToast showFetchResultTipWithError:error];
if (!error) {
[weakSelf.refreshHeadView endLoading];
if (weakSelf.dataController.haveNextPage) {
[weakSelf.refreshFootView endLoading];
}else{
[weakSelf.refreshFootView noMoreData];
}
}else{
[weakSelf.refreshHeadView endLoading];
weakSelf.refreshHeadView.statusLable.text = UMComLocalizedString(@"server_error", @"网络请求失败");
}
weakSelf.isLoadFinish = YES;
if (weakSelf.refreshSeverDataCompletionHandler) {
weakSelf.refreshSeverDataCompletionHandler(responseData, error);
}
[weakSelf handleFirstPageData:responseData error:error];
[weakSelf.tableView reloadData];
}];
}
- (void)loadMoreData
{
//首先判断非访客模式===begin
if (![self canVisitNextPage]) {
[self.refreshFootView endLoading];
self.refreshFootView.statusLable.text = @"登录加载更多";
return;
}
// //非访客模式,并且请求了第一次的网络数据
// if(![self canVisitNextPage] && self.visitMoreDataMode != UMComVisitType_None)
// {
//
// return;
// }
if (self.isLoadFinish == NO) {
return;
}
if (!self.dataController) {
[self.refreshFootView noMoreData];
return;
}
self.isLoadFinish = NO;
__weak typeof(self) weakSelf = self;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
[self.dataController loadNextPageDataWithCompletion:^(NSArray *responseData, NSError *error) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
weakSelf.isLoadFinish = YES;
if (!error) {
if (weakSelf.dataController.haveNextPage) {
[weakSelf.refreshFootView endLoading];
}else{
[weakSelf.refreshFootView noMoreData];
}
}else{
[weakSelf.refreshFootView endLoading];
weakSelf.refreshFootView.statusLable.text = UMComLocalizedString(@"server_error", @"网络请求失败");
}
if (weakSelf.loadMoreDataCompletionHandler) {
weakSelf.loadMoreDataCompletionHandler(responseData, error);
}
[weakSelf handleNextPageData:responseData error:error];
if (responseData) {
[weakSelf.tableView reloadData];
}
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/**
* 登陆用户和访客模式都会返回true,因其拥有一样的权限
*
* @return true 表示有权限查看下一页 false 代表没有权限查看下一页
*/
-(BOOL) canVisitNextPage
{
//登陆用户
if ([UMComSession sharedInstance].isLogin) {
return YES;
}
return self.dataController.canVisitNextPage;
}
#pragma mark - data handle method
/**
*处理本地数据
*/
- (void)handleLocalData:(NSArray *)data error:(NSError *)error
{
if (error) {
[UMComShowToast showFetchResultTipWithError:error];
}else{
}
}
/**
*处理网络请求第一页数据
*/
- (void)handleFirstPageData:(NSArray *)data error:(NSError *)error
{
if (error) {
[UMComShowToast showFetchResultTipWithError:error];
}else{
}
}
/**
*处理网络请求下一页数据
*/
- (void)handleNextPageData:(NSArray *)data error:(NSError *)error
{
if (error) {
[UMComShowToast showFetchResultTipWithError:error];
}else{
}
}
@end