關于如何在頁面中使用EGORefreshTableHeaderView的文章網上一大把, 抄來抄去的, 但也都沒什麼大問題. 隻是在XCode4.2的ARC環境中使用的時候, 錯誤一把. 借此機會, 完整的記錄一下如何排除錯誤, 及使用的方法.
首先第一步當然是下載下傳這個下拉更新的架構了. https://github.com/enormego/EGOTableViewPullRefresh/downloads
下載下傳之後解包, 然後将
EGORefreshTableHeaderDelegate.h
EGORefreshTableHeaderDelegate.m
這兩個檔案, 以及項目中的圖檔檔案都複制到你的項目檔案内, 這時候, 如果你啟用了ARC, 應該會報一片錯誤, 讓我們來具體看一下.
啟用了ARC之後, 就不允許手動的release了, 是以, [view release], [lable release] 還有 autorelease這樣的代碼都需要删除掉.
在EGORefreshTableHeaderDelegate.m的這個檔案中, @synthesize delegate=_delegate; 會報錯, "Existing ivar 'delegate' for assign property 'delegate' must be...
解決辦法是需要将EGORefreshTableHeaderDelegate.h檔案中的 assign 換為retain
//@property(nonatomic,assign) id <EGORefreshTableHeaderDelegate> delegate; //删除掉. 換為下面的
@property(nonatomic,retain)id <EGORefreshTableHeaderDelegate> delegate;
這樣代碼就會通過編譯了~ 這樣就需要将EGORefreshTableHeaderView與我們的tableview整合了, 然後按照Demo的方法,
添加EGORefreshTableHeaderDelegate的接口,
定義_reloading, 和EGORefreshHeaderView
聲明reloadTableViewDataSource和doneLoadingTableView這兩個函數
#import <UIKit/UIKit.h>
#import "EGORefreshTableHeaderView.h"
@interface FMFutureMessage : UIViewController<UITableViewDelegate, UITableViewDataSource,EGORefreshTableHeaderDelegate>
{
BOOL _reloading;
EGORefreshTableHeaderView *_refreshHeaderView;
}
@property(strong, nonatomic) IBOutlet UITableView *tbView;
-(void)reloadTableViewDataSource;
-(void)doneLoadingTableViewData;
@end
接下來, 我們需要将xib檔案中的TableViewController與這裡定義的tbView建立關聯, 因為我忘記了指定tbView與XIB中的TabViewController, 導緻了重新整理箭頭怎麼樣也顯示不出來, 是以一定不要忘記啊~~~~
現在我們處理一下.m檔案
處理m檔案, 建立關聯.和響應事件.
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
if(_refreshHeaderView == nil)
{
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tbView.bounds.size.height, self.view.frame.size.width, self.tbView.bounds.size.height)];
view.delegate = self;
[self.tbView addSubview:view];
_refreshHeaderView = view;
}
[_refreshHeaderView refreshLastUpdatedDate];
}
響應事件, 事件的響應代碼就簡單的多了, 按照DEMO的方法, 把接口的函數都聲明了就OK了.
-(void)reloadTableViewDataSource
{
NSLog(@"==開始加載資料");
[self.tbView reloadData];
_reloading = YES;
}
- (void)doneLoadingTableViewData{
NSLog(@"===加載完資料");
// model should call this when its done loading
_reloading = NO;
[_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tbView];
}
#pragma mark –
#pragma mark UIScrollViewDelegate Methods
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
}
#pragma mark –
#pragma mark EGORefreshTableHeaderDelegate Methods
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
[self reloadTableViewDataSource];
[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];
}
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
return _reloading; // should return if data source model is reloading
}
- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
return [NSDate date]; // should return date data source was last changed
}
最後, 如果是開發中文應用程式, 不要忘記進入EGORefreshTableHeaderView.m中, 将提示的英文換成中文.
好了, 完成~~~