天天看點

關于下拉更新架構 EGORefreshTableHeaderView在Xcode4.2中, ARC下面的使用

關于如何在頁面中使用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中, 将提示的英文換成中文. 

好了, 完成~~~

繼續閱讀