// // RAMessageViewController.m // Apex And Drivers // // Created by Jack on 2018/9/11. // Copyright © 2018年 USAI. All rights reserved. // #import "RAMessageViewController.h" #import "RAProgressHUD.h" #import "UIScrollView+Empty.h" #import "RAMessageModel.h" #import "JLRefreshFooter.h" #import "RAEmptyView.h" static const NSInteger limit = 20; typedef enum { LoadDataActionTypeInitial, LoadDataActionTypeReLoad, LoadDataActionTypeLoadMore } LoadDataActionType; @interface RAMessageViewController () @property (nonatomic,strong) IBOutlet UITableView *messageTableView; @property (nonatomic,strong) UIRefreshControl *refreshControl; @property (nonatomic,strong) NSMutableArray *messageArray; @property (nonatomic,strong) JLRefreshFooter *refreshFooter; @property (nonatomic,assign) BOOL unread; @end @implementation RAMessageViewController + (instancetype)viewControllerFromStoryboard { RAMessageViewController *messageVC = [[UIStoryboard storyboardWithName:@"message" bundle:nil] instantiateViewControllerWithIdentifier:[self storyboardID]]; return messageVC; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self configNavigationBar]; [self configTableView]; [self loadData]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Config - (void)configTableView { if (@available(iOS 11,*)) { self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } else { self.automaticallyAdjustsScrollViewInsets = NO; } self.tableView.tableFooterView = [UIView new]; self.tableView.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1]; UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; [refresh addTarget:self action:@selector(refreshControlValueChanged:) forControlEvents:UIControlEventValueChanged]; [self.tableView addSubview:refresh]; self.refreshControl = refresh; self.refreshFooter = [[JLRefreshFooter alloc] init]; self.refreshFooter.refreshDelegate = self; self.tableView.jl_footer = self.refreshFooter; // empty __weak typeof(self) weakSelf = self; self.tableView.emptyView = [RAEmptyView emptyViewWithTapBlk:^(id sender) { [weakSelf loadData]; }]; } - (void)configNavigationBar { UIBarButtonItem *unreadItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Unread", nil) style:UIBarButtonItemStylePlain target:self action:@selector(unreadBtnClick:)]; self.navigationItem.rightBarButtonItem = unreadItem; } #pragma mark - Getter - (UITableView *)tableView { return self.messageTableView; } - (NSArray *)messages { return self.messageArray; } - (NSMutableArray *)messageArray { if (!_messageArray) { _messageArray = [NSMutableArray array]; } return _messageArray; } - (NSUInteger)messageCount { return self.messageArray.count; } #pragma mark - Action - (void)refreshControlValueChanged:(UIRefreshControl *)refresh { [self reloadData]; } - (void)unreadBtnClick:(UIBarButtonItem *)sender { self.unread = !self.unread; if (self.unread) { sender.title = NSLocalizedString(@"All", nil); } else { sender.title = NSLocalizedString(@"Unread", nil); } [self reloadData]; } #pragma mark - Data - (void)loadData:(LoadDataActionType)actionType { if (self.loading) { return; } self.loading = YES; [self.tableView hideEmpty]; NSInteger offset = 0; if (actionType == LoadDataActionTypeLoadMore) { offset = [self messageCount]; } // show progress RAProgressHUD *hud = [RAProgressHUD showHUDOnView:self.view]; __weak typeof(self) weakSelf = self; BOOL unread = self.unread; dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSDictionary *json = [RADataProvider requestMessage:offset limit:limit unread:unread]; dispatch_async(dispatch_get_main_queue(), ^{ // dismiss progress [hud dismiss]; if (weakSelf.refreshControl.isRefreshing) { [weakSelf.refreshControl endRefreshing]; } if (weakSelf) { __strong typeof(weakSelf) strongSelf = weakSelf; if (actionType == LoadDataActionTypeLoadMore) { [strongSelf.refreshFooter performSelector:@selector(endRefresh)]; } int result = [[json objectForKey:@"result"] intValue]; if (result == RESULT_TRUE) { NSArray *messages = [json objectForKey:@"messages"]; if (actionType != LoadDataActionTypeLoadMore) { [strongSelf.messageArray removeAllObjects]; } else { if (messages.count < limit) { [strongSelf.refreshFooter performSelector:@selector(noMoreData)]; } } for (int i = 0; i < messages.count; i++) { NSDictionary *msg = [messages objectAtIndex:i]; RAMessageModel *model = [RAMessageModel new]; [model setValuesForKeysWithDictionary:msg]; [strongSelf.messageArray addObject:model]; } [strongSelf.tableView reloadData]; } else { [strongSelf.messageArray removeAllObjects]; strongSelf.tableView.contentOffset = CGPointZero; [strongSelf.tableView reloadData]; // process error NSString *msg = [json objectForKey:@"err_msg"]; // [strongSelf showAlert:msg]; [strongSelf showAlertTilte:NSLocalizedString(@"Warning", nil) message:msg]; } } weakSelf.loading = NO; if ([weakSelf messageCount] == 0) { [weakSelf.tableView showEmpty]; } else { [weakSelf.tableView hideEmpty]; } }); }); } - (void)loadData { [self loadData:LoadDataActionTypeInitial]; } - (void)reloadData { [self loadData:LoadDataActionTypeReLoad]; } - (void)loadMore { [self loadData:LoadDataActionTypeLoadMore]; } #pragma mark - Refresh Delegate - (void)jl_beginRefresh:(JLRefreshBasis *)refresh { if (refresh == self.refreshFooter) { if(refresh.state==JLRefreshStateNoMore) //数据取完不再加载 return; [self loadMore]; } } - (void)jl_pullRefresh:(JLRefreshBasis *)refresh state:(JLRefreshState)state percentage:(float)percentage { } - (void)jl_endRefresh:(JLRefreshBasis *)refresh { } @end