ifish/Ifish/UMCommunity/UMCommunitySDK/UMCommunityUI/Common/BaseVC/UMComRequestTableViewContro...

425 lines
14 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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