Commit 9e6f8831480ca136de80b4fc82d788ab23380431
1 parent
7aa2027583
Exists in
master
and in
1 other branch
Refactor and merge logic when request data for tableView in History screen, SNS …
…main screen. Add refresh control, load more action
Showing 10 changed files with 206 additions and 145 deletions Side-by-side Diff
- LifeLog/LifeLog.xcodeproj/project.pbxproj
- LifeLog/LifeLog/BaseTableViewController.h
- LifeLog/LifeLog/BaseTableViewController.m
- LifeLog/LifeLog/HistoryViewController.h
- LifeLog/LifeLog/HistoryViewController.m
- LifeLog/LifeLog/HistoryViewController.xib
- LifeLog/LifeLog/SNSViewController.h
- LifeLog/LifeLog/SNSViewController.m
- LifeLog/LifeLog/SNSViewController.xib
- LifeLog/LifeLog/ServerAPI.h
LifeLog/LifeLog.xcodeproj/project.pbxproj
... | ... | @@ -58,6 +58,7 @@ |
58 | 58 | E99E13B11F33720600C78787 /* LabelCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E99E13AF1F33720600C78787 /* LabelCollectionViewCell.m */; }; |
59 | 59 | E99E13B21F33720600C78787 /* LabelCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E99E13B01F33720600C78787 /* LabelCollectionViewCell.xib */; }; |
60 | 60 | E9D909211F3D559D004CF99F /* TweetObject.m in Sources */ = {isa = PBXBuildFile; fileRef = E9D909201F3D559D004CF99F /* TweetObject.m */; }; |
61 | + E9D909241F3D6E8C004CF99F /* BaseTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E9D909231F3D6E8C004CF99F /* BaseTableViewController.m */; }; | |
61 | 62 | E9F73DCC1F338A0F004A3A6F /* HistoryListTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E9F73DCA1F338A0F004A3A6F /* HistoryListTableViewCell.m */; }; |
62 | 63 | E9F73DCD1F338A0F004A3A6F /* HistoryListTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E9F73DCB1F338A0F004A3A6F /* HistoryListTableViewCell.xib */; }; |
63 | 64 | /* End PBXBuildFile section */ |
... | ... | @@ -170,6 +171,8 @@ |
170 | 171 | E99E13B01F33720600C78787 /* LabelCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LabelCollectionViewCell.xib; sourceTree = "<group>"; }; |
171 | 172 | E9D9091F1F3D559D004CF99F /* TweetObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TweetObject.h; sourceTree = "<group>"; }; |
172 | 173 | E9D909201F3D559D004CF99F /* TweetObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TweetObject.m; sourceTree = "<group>"; }; |
174 | + E9D909221F3D6E8C004CF99F /* BaseTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseTableViewController.h; sourceTree = "<group>"; }; | |
175 | + E9D909231F3D6E8C004CF99F /* BaseTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseTableViewController.m; sourceTree = "<group>"; }; | |
173 | 176 | E9F73DC91F338A0F004A3A6F /* HistoryListTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryListTableViewCell.h; sourceTree = "<group>"; }; |
174 | 177 | E9F73DCA1F338A0F004A3A6F /* HistoryListTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryListTableViewCell.m; sourceTree = "<group>"; }; |
175 | 178 | E9F73DCB1F338A0F004A3A6F /* HistoryListTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HistoryListTableViewCell.xib; sourceTree = "<group>"; }; |
... | ... | @@ -469,6 +472,8 @@ |
469 | 472 | 9CBDA0F91F2ECE2C0055DED1 /* BaseViewController.m */, |
470 | 473 | 6E48AF0B1F2F9D3200C1D184 /* CustomTextField.h */, |
471 | 474 | 6E48AF0C1F2F9D3200C1D184 /* CustomTextField.m */, |
475 | + E9D909221F3D6E8C004CF99F /* BaseTableViewController.h */, | |
476 | + E9D909231F3D6E8C004CF99F /* BaseTableViewController.m */, | |
472 | 477 | ); |
473 | 478 | name = BaseViewController; |
474 | 479 | sourceTree = "<group>"; |
... | ... | @@ -752,6 +757,7 @@ |
752 | 757 | 6E18CEDC1F2E40F50029891F /* User.m in Sources */, |
753 | 758 | 6ECC40711F2A5FEB00AAEB97 /* NSDate+helper.m in Sources */, |
754 | 759 | 6E18CED31F2E39DB0029891F /* LoginViewController.m in Sources */, |
760 | + E9D909241F3D6E8C004CF99F /* BaseTableViewController.m in Sources */, | |
755 | 761 | 6E84E3761F27A701001EB88E /* main.m in Sources */, |
756 | 762 | 6E84E3B51F27A98B001EB88E /* HistoryViewController.m in Sources */, |
757 | 763 | E9373E4D1F361A230059355A /* HistoryGraphObject.m in Sources */, |
LifeLog/LifeLog/BaseTableViewController.h
1 | +// | |
2 | +// BaseTableViewController.h | |
3 | +// LifeLog | |
4 | +// | |
5 | +// Created by nvtu on 8/11/17. | |
6 | +// Copyright © 2017 PhongNV. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +#import <UIKit/UIKit.h> | |
10 | + | |
11 | +@interface BaseTableViewController : UIViewController<UITableViewDelegate, UITableViewDataSource> { | |
12 | + NSMutableArray * _curDataList; | |
13 | + BOOL _firstTime; | |
14 | + BOOL _isLoading; | |
15 | + BOOL _isEndOfResult; | |
16 | + int _curPage; | |
17 | +} | |
18 | + | |
19 | +@property (weak, nonatomic) IBOutlet UITableView *tableBase; | |
20 | +@property (strong, nonatomic) UIRefreshControl *refreshControl; | |
21 | + | |
22 | +-(void) callRequestToUpdateData; | |
23 | +-(void) updateTableData : (NSArray *) array error: (NSError *) error; | |
24 | +-(void) resetData; | |
25 | +@end |
LifeLog/LifeLog/BaseTableViewController.m
1 | +// | |
2 | +// BaseTableViewController.m | |
3 | +// LifeLog | |
4 | +// | |
5 | +// Created by nvtu on 8/11/17. | |
6 | +// Copyright © 2017 PhongNV. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +#import "BaseTableViewController.h" | |
10 | +#import "Utilities.h" | |
11 | + | |
12 | +@interface BaseTableViewController () | |
13 | + | |
14 | +@end | |
15 | + | |
16 | +@implementation BaseTableViewController | |
17 | + | |
18 | +- (void)viewDidLoad { | |
19 | + [super viewDidLoad]; | |
20 | + _firstTime = false; | |
21 | + _curPage = 1; | |
22 | + _isEndOfResult = false; | |
23 | + _curDataList = [[NSMutableArray alloc] init]; | |
24 | + self.refreshControl = [[UIRefreshControl alloc] init]; | |
25 | + [self.refreshControl addTarget:self action:@selector(refreshTable) forControlEvents:UIControlEventValueChanged]; | |
26 | + [self.tableBase addSubview:self.refreshControl]; | |
27 | + // Do any additional setup after loading the view. | |
28 | +} | |
29 | + | |
30 | +- (void)didReceiveMemoryWarning { | |
31 | + [super didReceiveMemoryWarning]; | |
32 | + // Dispose of any resources that can be recreated. | |
33 | +} | |
34 | + | |
35 | +-(void) callRequestToUpdateData { | |
36 | + _isLoading = true; | |
37 | +} | |
38 | + | |
39 | +-(void) resetData { | |
40 | + _isLoading = false; | |
41 | + _isEndOfResult = false; | |
42 | + _firstTime = false; | |
43 | + _curPage = 1; | |
44 | + [_curDataList removeAllObjects]; | |
45 | + [self.tableBase reloadData]; | |
46 | + [self callRequestToUpdateData]; | |
47 | +} | |
48 | + | |
49 | +-(void) refreshTable { | |
50 | + [self resetData]; | |
51 | +} | |
52 | + | |
53 | +-(void) updateTableData : (NSArray *) array error: (NSError *) error { | |
54 | + BaseTableViewController __weak *weakSelf = self; | |
55 | + _isLoading = false; | |
56 | + _firstTime = true; | |
57 | + if(self.refreshControl != nil) { | |
58 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
59 | + [self.refreshControl endRefreshing]; | |
60 | + }); | |
61 | + } | |
62 | + if(error == nil) { | |
63 | + if(array.count != 0) { | |
64 | + [_curDataList addObjectsFromArray:array]; | |
65 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
66 | + [weakSelf.tableBase reloadData]; | |
67 | + }); | |
68 | + } | |
69 | + else { | |
70 | + if(_curPage != 1) { | |
71 | + _isEndOfResult = true; | |
72 | + _curPage -= 1; | |
73 | + } | |
74 | + else { | |
75 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
76 | + [weakSelf.tableBase reloadData]; | |
77 | + }); | |
78 | + } | |
79 | + } | |
80 | + } | |
81 | + else { | |
82 | + _curPage = MAX(1, _curPage - 1); | |
83 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
84 | + NSString *message = [error.userInfo objectForKey:@"message"]; | |
85 | + [Utilities showErrorMessage:message withViewController:weakSelf]; | |
86 | + }); | |
87 | + } | |
88 | +} | |
89 | + | |
90 | +#pragma mark UITableView Delegate | |
91 | +- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { | |
92 | + if((_curDataList == nil || _curDataList.count == 0) && _firstTime) { | |
93 | + UILabel * noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, tableView.frame.size.height)]; | |
94 | + noDataLabel.text = @"No data available"; | |
95 | + noDataLabel.backgroundColor = [UIColor clearColor]; | |
96 | + noDataLabel.textColor = [UIColor whiteColor]; | |
97 | + noDataLabel.textAlignment = NSTextAlignmentCenter; | |
98 | + tableView.backgroundView = noDataLabel; | |
99 | + tableView.backgroundView.layer.zPosition -= 1; | |
100 | + return 0; | |
101 | + } | |
102 | + tableView.backgroundView = nil; | |
103 | + return 1; | |
104 | +} | |
105 | + | |
106 | +- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |
107 | + return _curDataList.count; | |
108 | +} | |
109 | + | |
110 | +- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { | |
111 | + NSInteger lastRowIndex = [tableView numberOfRowsInSection:0] - 1; | |
112 | + if (indexPath.row == lastRowIndex) { | |
113 | + // This is the last cell | |
114 | + if(!_isLoading) { | |
115 | + _curPage += 1; | |
116 | + [self callRequestToUpdateData]; | |
117 | + } | |
118 | + } | |
119 | +} | |
120 | +@end |
LifeLog/LifeLog/HistoryViewController.h
... | ... | @@ -9,17 +9,15 @@ |
9 | 9 | #import <UIKit/UIKit.h> |
10 | 10 | #import <Charts/Charts-Swift.h> |
11 | 11 | |
12 | +#import "BaseTableViewController.h" | |
12 | 13 | #import "CollectionView.h" |
13 | 14 | |
14 | 15 | #import "Entities.h" |
15 | 16 | |
16 | -@interface HistoryViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate> { | |
17 | +@interface HistoryViewController : BaseTableViewController <UIScrollViewDelegate> { | |
17 | 18 | NSDate * _curDate; |
18 | 19 | HistoryObject * _curHisObj; |
19 | 20 | HistoryGraphObject * _curHisGraphObj; |
20 | - NSMutableArray * _curHisList; | |
21 | - | |
22 | - int _curPageIndex; | |
23 | 21 | } |
24 | 22 | |
25 | 23 | @property (weak, nonatomic) IBOutlet UILabel *lblCircleStep; |
... | ... | @@ -38,7 +36,6 @@ |
38 | 36 | |
39 | 37 | @property (weak, nonatomic) IBOutlet BarChartView *viewBarChart; |
40 | 38 | |
41 | -@property (weak, nonatomic) IBOutlet UITableView *tableListHistory; | |
42 | 39 | @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; |
43 | 40 | |
44 | 41 | - (IBAction)swipeAction:(UISwipeGestureRecognizer *)sender; |
LifeLog/LifeLog/HistoryViewController.m
... | ... | @@ -27,12 +27,11 @@ |
27 | 27 | [self setupChartView]; |
28 | 28 | |
29 | 29 | _curDate = [NSDate date]; |
30 | - _curHisList = [[NSMutableArray alloc] init]; | |
31 | 30 | |
32 | - [self callRequestToUpdateData]; | |
31 | + [self checkRequestData]; | |
33 | 32 | |
34 | 33 | //register nib for table view |
35 | - [self.tableListHistory registerNib:[UINib nibWithNibName:@"HistoryListTableViewCell" bundle:nil] forCellReuseIdentifier:@"HistoryListCell"]; | |
34 | + [self.tableBase registerNib:[UINib nibWithNibName:@"HistoryListTableViewCell" bundle:nil] forCellReuseIdentifier:@"HistoryListCell"]; | |
36 | 35 | } |
37 | 36 | |
38 | 37 | - (void)viewDidAppear:(BOOL) animated |
... | ... | @@ -55,7 +54,7 @@ |
55 | 54 | [self.viewCollectionType setSpacing:2]; |
56 | 55 | [self.viewCollectionType setArrayTitle:typeTitle]; |
57 | 56 | self.viewCollectionType.changeCurrentIndex = ^(int index){ |
58 | - [self callRequestToUpdateData]; | |
57 | + [self checkRequestData]; | |
59 | 58 | }; |
60 | 59 | |
61 | 60 | NSArray *modeTitle = [NSArray arrayWithObjects:NSLocalizedString(@"lifelog.history.mode.1", nil), NSLocalizedString(@"lifelog.history.mode.2", nil), NSLocalizedString(@"lifelog.history.mode.3", nil), nil]; |
... | ... | @@ -65,7 +64,7 @@ |
65 | 64 | [self.viewCollectionMode setNormalColor:[Utilities convertHecToColor:0x191919] highlightColor:[Utilities convertHecToColor:0x474747] textColor:[UIColor whiteColor]]; |
66 | 65 | [self.viewCollectionMode setArrayTitle:modeTitle]; |
67 | 66 | self.viewCollectionMode.changeCurrentIndex = ^(int index){ |
68 | - [self callRequestToUpdateData]; | |
67 | + [self checkRequestData]; | |
69 | 68 | }; |
70 | 69 | |
71 | 70 | NSArray *shareTitle = [NSArray arrayWithObjects:NSLocalizedString(@"lifelog.history.share.1", nil), NSLocalizedString(@"lifelog.history.share.2", nil), NSLocalizedString(@"lifelog.history.share.3", nil), NSLocalizedString(@"lifelog.history.share.4", nil), NSLocalizedString(@"lifelog.history.share.5", nil), nil]; |
... | ... | @@ -75,10 +74,10 @@ |
75 | 74 | [self.viewCollectionShare disableSelection]; |
76 | 75 | |
77 | 76 | //add tap gesture for enable tap on gesture on CollectionView in ScrollView |
78 | - UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)]; | |
79 | - [recognizer setNumberOfTapsRequired:1]; | |
80 | - self.scrollView.userInteractionEnabled = YES; | |
81 | - [self.scrollView addGestureRecognizer:recognizer]; | |
77 | +// UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)]; | |
78 | +// [recognizer setNumberOfTapsRequired:1]; | |
79 | +// self.scrollView.userInteractionEnabled = YES; | |
80 | +// [self.scrollView addGestureRecognizer:recognizer]; | |
82 | 81 | } |
83 | 82 | |
84 | 83 | - (void)setupChartView { |
... | ... | @@ -141,13 +140,12 @@ |
141 | 140 | } |
142 | 141 | } |
143 | 142 | |
144 | --(void) callRequestToUpdateData { | |
145 | - MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; | |
146 | - NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; | |
147 | - int type = self.viewCollectionType.getCurrentIndex; | |
148 | - int mode = self.viewCollectionMode.getCurrentIndex + 1; | |
149 | - | |
150 | - if(self.tableListHistory.alpha == 0.0) { | |
143 | +-(void) checkRequestData { | |
144 | + if(self.tableBase.alpha == 0.0) { | |
145 | + NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; | |
146 | + int type = self.viewCollectionType.getCurrentIndex; | |
147 | + int mode = self.viewCollectionMode.getCurrentIndex + 1; | |
148 | + MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; | |
151 | 149 | [[ServerAPI server] requestHistory:token atDate:_curDate withType:type andMode:mode CompletionHandler:^(HistoryObject *object, NSError *error) { |
152 | 150 | HistoryViewController __weak *weakSelf = self; |
153 | 151 | dispatch_async(dispatch_get_main_queue(), ^{ |
154 | 152 | |
155 | 153 | |
156 | 154 | |
... | ... | @@ -186,37 +184,39 @@ |
186 | 184 | }]; |
187 | 185 | } |
188 | 186 | else { |
189 | - [[ServerAPI server] requestHistoryList:token withType:type andMode:mode AtPage:1 CompletionHandler:^(NSMutableArray *object, NSError *error) { | |
190 | - HistoryViewController __weak *weakSelf = self; | |
191 | - dispatch_async(dispatch_get_main_queue(), ^{ | |
192 | - if(hudView != nil) { | |
193 | - [hudView hideAnimated:true]; | |
194 | - } | |
195 | - }); | |
196 | - if(error == nil) { | |
197 | - _curHisList = object; | |
198 | - dispatch_async(dispatch_get_main_queue(), ^{ | |
199 | - [weakSelf.tableListHistory reloadData]; | |
200 | - }); | |
201 | - } | |
202 | - else { | |
203 | - dispatch_async(dispatch_get_main_queue(), ^{ | |
204 | - NSString *message = [error.userInfo objectForKey:@"message"]; | |
205 | - [Utilities showErrorMessage:message withViewController:weakSelf]; | |
206 | - }); | |
207 | - } | |
208 | - }]; | |
187 | + [self resetData]; | |
209 | 188 | } |
210 | 189 | } |
211 | 190 | |
191 | +-(void) callRequestToUpdateData { | |
192 | + [super callRequestToUpdateData]; | |
193 | + NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; | |
194 | + int type = self.viewCollectionType.getCurrentIndex; | |
195 | + int mode = self.viewCollectionMode.getCurrentIndex + 1; | |
196 | + | |
197 | + MBProgressHUD *hudView = nil; | |
198 | + if(_curPage == 1 && !self.refreshControl.isRefreshing) { | |
199 | + hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; | |
200 | + } | |
201 | + [[ServerAPI server] requestHistoryList:token withType:type andMode:mode AtPage:_curPage CompletionHandler:^(NSArray *array, NSError *error) { | |
202 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
203 | + if(hudView != nil) { | |
204 | + [hudView hideAnimated:true]; | |
205 | + } | |
206 | + }); | |
207 | + HistoryViewController __weak *weakSelf = self; | |
208 | + [weakSelf updateTableData:array error:error]; | |
209 | + }]; | |
210 | +} | |
211 | + | |
212 | 212 | #pragma mark IBAction |
213 | 213 | -(void) swipeAction:(UISwipeGestureRecognizer *)sender { |
214 | 214 | bool alphaValue = self.scrollView.alpha == 1.0 ? 1.0 : 0.0; |
215 | 215 | [UIView animateWithDuration:0.5 animations:^{ |
216 | - self.tableListHistory.alpha = alphaValue; | |
216 | + self.tableBase.alpha = alphaValue; | |
217 | 217 | self.scrollView.alpha = 1.0 - alphaValue; |
218 | 218 | } completion:^(BOOL completed) { |
219 | - [self callRequestToUpdateData]; | |
219 | + [self checkRequestData]; | |
220 | 220 | }]; |
221 | 221 | } |
222 | 222 | |
223 | 223 | |
... | ... | @@ -247,28 +247,9 @@ |
247 | 247 | } |
248 | 248 | |
249 | 249 | #pragma mark UITableView Delegate |
250 | -- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { | |
251 | - if(_curHisList == nil || _curHisList.count == 0) { | |
252 | - UILabel * noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, tableView.frame.size.height)]; | |
253 | - noDataLabel.text = @"No data available"; | |
254 | - noDataLabel.backgroundColor = [UIColor clearColor]; | |
255 | - noDataLabel.textColor = [UIColor whiteColor]; | |
256 | - noDataLabel.textAlignment = NSTextAlignmentCenter; | |
257 | - tableView.backgroundView = noDataLabel; | |
258 | - tableView.backgroundView.layer.zPosition -= 1; | |
259 | - return 0; | |
260 | - } | |
261 | - tableView.backgroundView = nil; | |
262 | - return 1; | |
263 | -} | |
264 | - | |
265 | -- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |
266 | - return _curHisList.count; | |
267 | -} | |
268 | - | |
269 | 250 | - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
270 | 251 | HistoryListTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"HistoryListCell"]; |
271 | - HistoryObject * obj = [_curHisList objectAtIndex:indexPath.row]; | |
252 | + HistoryObject * obj = [_curDataList objectAtIndex:indexPath.row]; | |
272 | 253 | cell.lblStep.text = [NSString stringWithFormat:@"%d", obj.step]; |
273 | 254 | cell.lblPower.text = [NSString stringWithFormat:@"%0.2f", obj.calories]; |
274 | 255 | cell.lblDistance.text = [NSString stringWithFormat:@"%0.1f", obj.distance]; |
LifeLog/LifeLog/HistoryViewController.xib
... | ... | @@ -20,7 +20,7 @@ |
20 | 20 | <outlet property="lblStep" destination="0pf-fX-QXT" id="jK4-9Y-89Q"/> |
21 | 21 | <outlet property="lblTime" destination="PfZ-7x-LAR" id="NQv-fs-rl7"/> |
22 | 22 | <outlet property="scrollView" destination="rey-N3-l8b" id="s3w-fi-n5l"/> |
23 | - <outlet property="tableListHistory" destination="FXQ-4O-sRc" id="VNN-sx-9xu"/> | |
23 | + <outlet property="tableBase" destination="FXQ-4O-sRc" id="UHy-Nk-f7u"/> | |
24 | 24 | <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> |
25 | 25 | <outlet property="viewBarChart" destination="VqD-Y3-cYQ" id="RdJ-G5-pPy"/> |
26 | 26 | <outlet property="viewCollectionMode" destination="BVv-qD-EHM" id="A6n-32-oxg"/> |
LifeLog/LifeLog/SNSViewController.h
... | ... | @@ -7,16 +7,11 @@ |
7 | 7 | // |
8 | 8 | |
9 | 9 | #import <UIKit/UIKit.h> |
10 | +#import "BaseTableViewController.h" | |
10 | 11 | |
11 | -@interface SNSViewController : UIViewController<UITableViewDelegate, UITableViewDataSource> { | |
12 | - BOOL _firstTime; | |
13 | - BOOL _isLoading; | |
14 | - BOOL _isEndOfResult; | |
15 | - int _curPage; | |
16 | - NSMutableArray * _curTweetList; | |
17 | -} | |
12 | +@interface SNSViewController : BaseTableViewController { | |
18 | 13 | |
19 | -@property (weak, nonatomic) IBOutlet UITableView *tableRecent; | |
14 | +} | |
20 | 15 | |
21 | 16 | @end |
LifeLog/LifeLog/SNSViewController.m
... | ... | @@ -22,16 +22,11 @@ |
22 | 22 | [super viewDidLoad]; |
23 | 23 | // Do any additional setup after loading the view from its nib. |
24 | 24 | self.title = NSLocalizedString(@"lifelog.tapbar.sns", nil); |
25 | - _firstTime = true; | |
26 | - _curPage = 1; | |
27 | - _isEndOfResult = false; | |
28 | - | |
29 | - _curTweetList = [[NSMutableArray alloc] init]; | |
30 | - | |
25 | + | |
31 | 26 | [self callRequestToUpdateData]; |
32 | 27 | |
33 | 28 | //register nib for table view |
34 | - [self.tableRecent registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"]; | |
29 | + [self.tableBase registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"]; | |
35 | 30 | } |
36 | 31 | |
37 | 32 | - (void)didReceiveMemoryWarning { |
38 | 33 | |
... | ... | @@ -41,28 +36,9 @@ |
41 | 36 | |
42 | 37 | |
43 | 38 | #pragma mark UITableView Delegate |
44 | -- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { | |
45 | - if((_curTweetList == nil || _curTweetList.count == 0) && !_firstTime) { | |
46 | - UILabel * noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, tableView.frame.size.height)]; | |
47 | - noDataLabel.text = @"No data available"; | |
48 | - noDataLabel.backgroundColor = [UIColor clearColor]; | |
49 | - noDataLabel.textColor = [UIColor whiteColor]; | |
50 | - noDataLabel.textAlignment = NSTextAlignmentCenter; | |
51 | - tableView.backgroundView = noDataLabel; | |
52 | - tableView.backgroundView.layer.zPosition -= 1; | |
53 | - return 0; | |
54 | - } | |
55 | - tableView.backgroundView = nil; | |
56 | - return 1; | |
57 | -} | |
58 | - | |
59 | -- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |
60 | - return _curTweetList.count; | |
61 | -} | |
62 | - | |
63 | 39 | - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
64 | 40 | SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"]; |
65 | - TweetObject *object = [_curTweetList objectAtIndex:indexPath.row]; | |
41 | + TweetObject *object = [_curDataList objectAtIndex:indexPath.row]; | |
66 | 42 | if(object.avatarLink && ![object.avatarLink isKindOfClass:[NSNull class]]) { |
67 | 43 | [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatarLink]]]; |
68 | 44 | } |
69 | 45 | |
70 | 46 | |
71 | 47 | |
72 | 48 | |
73 | 49 | |
... | ... | @@ -75,64 +51,25 @@ |
75 | 51 | return cell; |
76 | 52 | } |
77 | 53 | |
78 | -- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { | |
79 | - NSInteger lastRowIndex = [tableView numberOfRowsInSection:0] - 1; | |
80 | - if (indexPath.row == lastRowIndex) { | |
81 | - // This is the last cell | |
82 | - if(!_isLoading) { | |
83 | - _curPage += 1; | |
84 | - [self callRequestToUpdateData]; | |
85 | - } | |
86 | - } | |
87 | -} | |
88 | 54 | #pragma mark Private Function |
89 | 55 | |
90 | 56 | -(void) callRequestToUpdateData { |
91 | - _isLoading = true; | |
57 | + [super callRequestToUpdateData]; | |
58 | + | |
92 | 59 | NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; |
93 | 60 | MBProgressHUD *hudView = nil; |
94 | - if(_curPage == 1) { | |
61 | + if(_curPage == 1 && !self.refreshControl.isRefreshing) { | |
95 | 62 | hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; |
96 | 63 | } |
97 | 64 | [[ServerAPI server] requestRecentlyTweetsList:token withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){ |
98 | - SNSViewController __weak *weakSelf = self; | |
99 | - _isLoading = false; | |
100 | 65 | dispatch_async(dispatch_get_main_queue(), ^{ |
101 | 66 | if(hudView != nil) { |
102 | 67 | [hudView hideAnimated:true]; |
103 | 68 | } |
104 | 69 | }); |
105 | - if(error == nil) { | |
106 | - if(_curPage == 1) { | |
107 | - [_curTweetList removeAllObjects]; | |
108 | - } | |
109 | - if(array.count != 0) { | |
110 | - [_curTweetList addObjectsFromArray:array]; | |
111 | - dispatch_async(dispatch_get_main_queue(), ^{ | |
112 | - [weakSelf.tableRecent reloadData]; | |
113 | - }); | |
114 | - } | |
115 | - else { | |
116 | - _isEndOfResult = true; | |
117 | - _curPage = MAX(1, _curPage - 1); | |
118 | - } | |
119 | - } | |
120 | - else { | |
121 | - _curPage = MAX(1, _curPage - 1); | |
122 | - dispatch_async(dispatch_get_main_queue(), ^{ | |
123 | - NSString *message = [error.userInfo objectForKey:@"message"]; | |
124 | - [Utilities showErrorMessage:message withViewController:weakSelf]; | |
125 | - }); | |
126 | - } | |
127 | - | |
70 | + SNSViewController __weak *weakSelf = self; | |
71 | + [weakSelf updateTableData:array error:error]; | |
128 | 72 | }]; |
129 | -} | |
130 | - | |
131 | --(void) resetData { | |
132 | - _isLoading = false; | |
133 | - _isEndOfResult = false; | |
134 | - _firstTime = true; | |
135 | - _curPage = 1; | |
136 | 73 | } |
137 | 74 | |
138 | 75 | @end |
LifeLog/LifeLog/SNSViewController.xib
... | ... | @@ -10,7 +10,7 @@ |
10 | 10 | <objects> |
11 | 11 | <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SNSViewController"> |
12 | 12 | <connections> |
13 | - <outlet property="tableRecent" destination="KcG-O5-UhK" id="80p-fP-6Pb"/> | |
13 | + <outlet property="tableBase" destination="KcG-O5-UhK" id="gDL-iU-n52"/> | |
14 | 14 | <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> |
15 | 15 | </connections> |
16 | 16 | </placeholder> |
LifeLog/LifeLog/ServerAPI.h
... | ... | @@ -25,7 +25,7 @@ |
25 | 25 | #pragma mark - History Screen Function |
26 | 26 | - (void) requestHistory:(NSString *)token atDate:(NSDate *)date withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryObject *, NSError *)) completion; |
27 | 27 | - (void) requestHistoryGraph:(NSString *)token withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryGraphObject *, NSError *)) completion; |
28 | -- (void) requestHistoryList:(NSString *)token withType:(int)type andMode:(int) mode AtPage:(int) page CompletionHandler:(void (^)(NSMutableArray *, NSError *)) completion; | |
28 | +- (void) requestHistoryList:(NSString *)token withType:(int)type andMode:(int) mode AtPage:(int) page CompletionHandler:(void (^)(NSArray *, NSError *)) completion; | |
29 | 29 | |
30 | 30 | #pragma mark - SNS Screen Function |
31 | 31 | - (void) requestRecentlyTweetsList:(NSString *)token withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion; |