티스토리 뷰
http://nsscreencast.com/episodes/8-automatic-uitableview-paging
프로세스
- 현재페이지 = 0 으로 부여.
- UITableView가 보여지면서 delegate 중 numberOfRowsInSection 메쏘드 작동.
- 현재 페이지가 0이므로 1개의 셀(loadingCell 메쏘드로 만들어지는...) 있다고 리턴.
- cellForRowAtIndexPath 메쏘드 작동되며
현재 indexPath, indexNodes 모두 nil 상태이므로
loadingCell 메쏘드 작동시켜 activityIndicator가 있는 로딩셀을 만들고 리턴. - 셀이 보여질때 willDisplayCell 메쏘드 호출되는데
현재 셀이 로딩셀이면 현재페이지+1 하고
네트워크로부터 데이터 로딩 시작하는 fetchBeers 메쏘드 작동시킴.
(최초 로딩시는 당연히 로딩셀이므로 do while {} 구문처럼 fetchBeers 메쏘드 작동) - fetchBeers 메쏘드 작동으로
네트워크로부터 데이터 불러오고 beers 배열에 탑재 후
UITableView 새로고침. - 2.부터의 과정 반복하는데
4.의 cellForrowAtIndexPath 메쏘드에서
beers.count 만큼 UITableViewCell에 데이터를 탑재 후
그 숫자가 넘어가면 로딩셀을 마지막에 붙임
준비물
http://afnetworking.com
A network framework for iOS & OSX
아래 소스상의 AFJSONRequest~ , AFHTTPRequest~ 들 사용을 위해한건데
대신, HTTP 통신을 위해서라면 NSURLConnection 사용 당연 가능.
선언
#define kLoadingCellTag 1273
NSInteger _currentPage;
NSInteger _totalPages;
NSMutableArray beers;
전체 소스코드
Initialization
- (void)viewDidLoad {
[super viewDidLoad];
self.beers = [NSMutableArray array];
_currentPage = 0;
}
Issue HTTP Request for the current page
- (void)fetchBeers {
NSString *urlString = [NSString
stringWithFormat:@"http://localhost:3000/beers.json?page=%d",
_currentPage];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation =
[[AFJSONRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:
^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"responseObject %@", responseObject);
_totalPages = [[responseObject
objectForKey:@"total_pages"] intValue];
for (id beerDictionary in [responseObject
objectForKey:@"beers"]) {
Beer *beer = [[Beer alloc]
initWithDictionary:beerDictionary];
if (![self.beers containsObject:beer]) {
[self.beers addObject:beer];
}
[beer release];
}
[self.tableView reloadData];
} failure:
^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", [error localizedDescription]);
[[[[UIAlertView alloc]
initWithTitle:@"Error fetching beers!"
message:@"Please try again later"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil] autorelease] show];
}];
[operation start];
[operation release];
}
Offset number of rows
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
if (_currentPage == 0) {
return 1;
}
if (_currentPage < _totalPages) {
return self.beers.count + 1;
}
return self.beers.count;
}
Render the cells
- (UITableViewCell *)beerCellForIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"cell";
UITableViewCell *cell = [self.tableView
dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:cellIdentifier] autorelease];
}
Beer *beer = [self.beers objectAtIndex:indexPath.row];
cell.textLabel.text = beer.name;
cell.detailTextLabel.text = beer.brewery;
return cell;
}
- (UITableViewCell *)loadingCell {
UITableViewCell *cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:nil] autorelease];
UIActivityIndicatorView *activityIndicator =
[[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicator.center = cell.center;
[cell addSubview:activityIndicator];
[activityIndicator release];
[activityIndicator startAnimating];
cell.tag = kLoadingCellTag;
return cell;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row < self.beers.count) {
return [self beerCellForIndexPath:indexPath];
} else {
return [self loadingCell];
}
}
Fetching the next page
- (void)tableView:(UITableView *)tableView
willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath {
if (cell.tag == kLoadingCellTag) {
_currentPage++;
[self fetchBeers];
}
'모바일 > iOS' 카테고리의 다른 글
message sent to deallocated instance 같은 오류 Debug (0) | 2014.02.24 |
---|---|
UITable Cell, UILabel, UITextView 등에서 자동 높이 (1) | 2014.02.22 |
UIImageView+WebCache.h: No such file or directory 오류 해결 (0) | 2013.05.28 |
XCode 4.x 이상에서 디버깅 셋팅과 추적 (0) | 2013.05.27 |
APNS 푸시 서버 라이브러리 (0) | 2012.08.13 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
- Make Use Of
- How to geek
- 인터넷 통계정보 검색시스템
- 트위터 공유 정보모음
- 웹표준KR
- 치우의 컴맹탈출구
- Dev. Cheat Sheets
- w3schools
- Dev. 조각들
- ASP Ajax Library
- CSS Tricks
- WebResourcesDepot
- jQuery Selectors Tester
- DeveloperSnippets
- Smashing Magazine
- Nettuts+
- devListing
- 웹 리소스 사이트(한)
- Mobile tuts+
- Dream In Code
- Developer Tutorials
- CSS3 Previews
- 자북
- 안드로이드 사이드
- Code Visually
- Code School
- SQLer.com
- 무료 파워포인트 템플릿
- iconPot
- Free PowerPoint Templates
- Design Bombs
- Web Designer Wall
- 1st Webdesigner
- Vandelay Design
- 무료 벡터 이미지 사이트들
- Tripwire Magazine
- Web TrendSet
- WebMonkey
- 윤춘근 프리젠테이션 디자이너 블로그
- cz.cc 무료 DNS
- [웹하드] MediaFire
- [웹하드] DivShare
- 한컴 인터넷 오피스
TAG
- nginx
- CSS
- centos
- 한글
- Docker
- iphone
- laravel
- Wordpress
- 워드프레스
- JSON
- Debug
- Mac
- IOS
- API
- PHP
- javascript
- IE
- Linux
- Prototype
- 안드로이드
- mssql
- Android
- iis
- Chrome
- classic asp
- nodejs
- JQuery
- git
- ASP
- sencha touch
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함