ios UITableView分頁載入

來源:互聯網
上載者:User

轉載自:http://blog.csdn.net/w59879213/article/details/7208288

在網上搜尋了一下, 介紹UITableView分頁的文章不少, 而且都很統一, 代碼也都正確. 只是沒有把思路給整理出來. 我這裡借花獻佛, 整理一下.

這裡假定的前提是, 你已經將UITableView添加到了View中, 並且在h檔案中實現了 UITableViewDelegate,UITableViewDataSource 這兩個介面, 且已經與你後台定義的tblView建立起了關聯, UITableView的datesource和delegete也都已經指向了file's owner.

如果此處不太明白的話, 建議還是複習一下如何使用UITableView, 再來研究這部份.

1. 首先需要做的是, 定義資料來源. UITableView是需要一個資料來源的, 我這用使用的是SQLITE資料庫, 因此做了一個小小的分頁查詢. SQLIte的分頁查詢與MySQL的相同.

[sql]view plaincopy

  1. select * from table where 列名 = 條件 limit 頁數 * 每頁顯示記錄數, 每頁顯示記錄數  

[cpp]view plaincopy

  1. +(NSMutableArray *)GetRecord:(NSInteger)p  

  2. {   //代碼中, 除了SQLITE的SELECT操作之外, 和分頁有關係的就是參數p和下面分頁的SQL文法拼接形式了.  

  3.    NSString *query = [NSString stringWithFormat:@"select * from table order by ID limit %d,10", (p-1) * 10];  

  4.    char *select =(char *)[query UTF8String];  

  5.    NSMutableArray *array = [[NSMutableArray alloc] init];  

  6.    sqlite3 *database;  

  7.    if(sqlite3_open([DbObject GetDatabasePath], &database) == SQLITE_OK)  

  8.    {  

  9.        sqlite3_stmt *statement;  

  10.        if(sqlite3_prepare_v2(database, select, -1, &statement, nil)== SQLITE_OK)  

  11.        {  

  12.            while (sqlite3_step(statement) == SQLITE_ROW)   

  13.            {  

  14.                 //根據欄位的類似, 使用sqlite3_column_init, sqlite3_column_blob, sqlite3_column_text等將資料從屬記錄行中取出來. 此處代碼略  

  15.                //然後將出來的值,以索引值對應的形式賦值給NSDictionary數組.  

  16.                NSDictionary *rowRecord = [[NSDictionary alloc] initWithObjectsAndKeys:nsID,@"ID", data, @"Image",  

  17.                                           nsMessage, @"Message", nsVideoURL, @"VideoURL", nsAudioURL, @"AudioURL",   

  18.                                           nsToLine, @"ToLine",nsSendDate,@"SendDate", nil];  

  19.        //將NSDictionary添加到NSMuableArray數組中.  

  20.                [array addObject:rowRecord];  

  21.        }  

  22.        sqlite3_finalize(statement);   

  23.    }  

  24.    sqlite3_close(database);  

  25.    }  

  26.    return array;  

  27. }  

當然了這個函數還要在你的h檔案中聲明, 然後才可以在m檔案中implement,否則當你使用 [類名 函數名:參數] 訪問時會找不到方法的.

 

2. 這下要進入我們的頁面進行設計了.  首先要在頁面的.h 檔案中聲明變數  NSInteger currentPage, 這個變數是用來告訴系統, 我現在是處於第幾頁.

[cpp]view plaincopy

  1. NSInteger currentPage;  

  2. @property(strong, nonatomic) IBOutlet NSMutableArray *listData;  

  3. @property(strong, nonatomic) IBOutlet UITableView *tbView;  

3. 在系統初始化時, 將變數的值設定為1, 然後對UITableView對象使用到的資料來源進行賦值.

[cpp]view plaincopy

  1. - (void)viewDidLoad  

  2. {  

  3.    [super viewDidLoad];  

  4.    // Do any additional setup after loading the view from its nib.  

  5.    currentPage = 1;  

  6.    listData = [DbMyClass GetRecord:currentPage];  

  7. }  

4. 然後我們要做的就是處理UITableView了, 正常情況下, 我們在numOfRowsInSections的地方返回的是總記錄數, 但是我們多加了行分頁按鈕, 因此返回的總記錄數要加上1

[cpp]view plaincopy

  1. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  

  2. {  

  3.    NSInteger row = [listData count];  

  4.    return row +1;  

  5. }  

5. 然後我們在 cellForRowAtIndexPath 中正常處理我們的儲存格資訊, 比如說我們使用了自訂儲存格, 我們就要在這裡載入...  這是最重要的一點是, 需要判斷 [indexPathrow] =和[listDatacount]的值是否相同, 如果相同, 那麼就需要載入我們的分頁按鈕了.[cpp]view
plaincopy

  1. -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  

  2. {  

  3.    static NSString *CellTableIdentifier = @"CusCellFutureMessage";  

  4.    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];  

  5.    if(cell == nil)  

  6.    {  

  7.        if([indexPath row] == [listData count])  

  8.        {  

  9.            //建立一個儲存格, 並且將其樣式調整成我們需要的樣子.  

  10.            cell=[[UITableViewCell alloc] initWithFrame:CGRectZero   

  11.                                         reuseIdentifier:@"LoadMoreIdentifier"];   

  12.            cell.font = [UIFont boldSystemFontOfSize:13];    

  13.            cell.textLabel.text = @"讀取更多...";  

  14.        }  

  15.        else  

  16.        {  

  17.               //其它儲存格的初始化事件. 自訂儲存格的讀取, 或者是儲存格的設定等.  

  18.        }  

  19.    }  

  20.    return cell;  

  21. }  

6. 然後就是註冊UITableView被點擊之後, 要觸發的事件了. 事件需要在 didSelectRowAtIndexPath 中定義[cpp]view plaincopy

  1. -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  

  2. {  

  3.    if([indexPath row] == [listData count])  

  4.    {  

  5.        UITableViewCell *loadMoreCell=[tableView cellForRowAtIndexPath:indexPath];     

  6.        loadMoreCell.textLabel.text=@"正在讀取更資訊 …";     

  7.        [self performSelectorInBackground:@selector(loadMore) withObject:nil];     

  8.        [tableView deselectRowAtIndexPath:indexPath animated:YES];     

  9.        return;    

  10.    }  

  11.    else  

  12.    {  

  13.         //其它儲存格的事件    

  14.    }  

  15. }  

7. 也許你注意到了, 在給儲存格設定peformSelectorInBackground的時候, 我們調用了loadMore函數. 這個函數就是我們這裡的第二核心的方法了.

[cpp]view plaincopy

  1. -(void)loadMore     

  2. {   //當你按下這個按鈕的時候, 意味著你需要看下一頁了, 因此當前頁碼加1  

  3.    currentPage ++;  

  4.    NSMutableArray *more = [DbMyClass GetRecord:currentPage]; //通過調用GetRecord方法, 將資料取出. 

  5.    [self performSelectorOnMainThread:@selector(appendTableWith:) withObject:more waitUntilDone:NO];     

  6. }     

  7. -(void) appendTableWith:(NSMutableArray *)data     

  8. {   //將loadMore中的NSMutableArray添加到原來的資料來源listData中.  

  9.    for (int i=0;i<[data count];i++) {     

  10.        [listData addObject:[data objectAtIndex:i]];     

  11.    }     

  12.    NSMutableArray *insertIndexPaths = [NSMutableArray arrayWithCapacity:10];     

  13.    for (int ind = 0; ind < [data count]; ind++) {     

  14.        NSIndexPath    *newPath =  [NSIndexPath indexPathForRow:[listData indexOfObject:[data objectAtIndex:ind]] inSection:0];     

  15.        [insertIndexPaths addObject:newPath];     

  16.    }     

  17.    //重新調用UITableView的方法, 來產生行.  

  18.    [self.tbView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade];     

  19. }    

這些函數看著挺多的, 其實仔細看看也並不複雜, 當你實現了UITableView的介面後, 除了 loadMore, appendTableWitdh 以及定義的分頁函數GetRecord, 其餘的都是在實現UITableView的介面中定義的方法.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.