你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 講授iOS開辟中UITableView列表設計的根本要點

講授iOS開辟中UITableView列表設計的根本要點

編輯:IOS開發綜合

1、UITableView簡略引見

   1.tableView是一個用戶可以轉動的多行單列列表,在表視圖中,每行都是一個UITableViewCell對象,表視圖有兩種作風可選

typedef NS_ENUM(NSInteger, UITableViewStyle) {
    UITableViewStylePlain,                  // regular table view
    UITableViewStyleGrouped                 // preferences style table view
};

201612193806481.png (628×1000)

 2.表視圖還可為其添加索引值,好比通信錄中右邊索引列表,每個索引項對應其節頭題目

201612193837352.png (320×568)201612193854714.png (320×568)

這兩種情勢的列表上面還會引見到。
3.最簡略的一種表視圖是一個選擇列表,可以限制選擇一列或多列,如上圖左邊。  

 4.頁眉和頁腳,可以依據本身的須要,對tableView設置頁眉和頁腳的內容

201612193918210.png (320×568)

2、UITableViewCell

    1. UITableViewCell是表視圖的單位格,體系會緩存可見的行。經由過程完成UITableViewDataSource協定中必需完成的署理辦法CellForRowAtIndexPath辦法來填充表視圖上單位格數據。

    2. UITableViewCell有四種款式可選   

UITableViewCellStyleDefault,    // 簡略包括一個可選的imageView和一個label顯示文本
UITableViewCellStyleValue1, // 包括可選的imageView,一個textLabel和一個detailLabel,個中detailLabel地位在最左,右對齊,文本色彩為藍色
UITableViewCellStyleValue2,     //包括一個textLabel和一個detailLabel,textLabel默許為藍色文本,右對齊,detailLabel的地位緊挨著textLabel左邊,默許文本左對齊,色彩為黑色  
UITableViewCellStyleSubtitle    // 包括可選的imageView,一個textLabel,一個detailLabel,個中detailLabel在textLabel下方,字體較小,默許色彩為黑色,左對齊

3、創立簡略TableView

1. 先給出後果圖

201612194009636.png (320×568)201612194022150.png (320×568)

2. 創立方法及代碼(本文只講述代碼創立)

        a) 創立一個Single  View Application,定名為"tableView"

        b) 新建一個繼續自UITableView的類,關於tableView的完成將全體寫在這個類中(固然也可直接在對      應所須要用得ViewController中創立,分別出來的利益是可以在將tableView的辦法零丁放在一個類中,當ViewController的代碼量比擬年夜或許這個table須要在多個處所應用時推舉應用),定名為general_table_view.

        c) 代碼

①在general_table_view.h文件中,添加幾個屬性   

@interface general_table_view : UITableView

// tableView的坐標
@property (nonatomic, assign) CGRect        tableViewFrame;
 
// 寄存Cell上各行textLabel值
@property (nonatomic, copy)NSMutableArray * textLabel_MArray;
 
// 寄存Cell上各行imageView上圖片
@property (nonatomic, copy)NSMutableArray * images_MArray;
 
// 寄存Cell上各行detailLabel值
@property (nonatomic, copy)NSMutableArray * subtitle_MArray;
 
@end

②在general_table_view.m的interface中聲明朝理

@interface general_table_view ()<UITableViewDataSource,UITableViewDelegate>
 
@end

③在.m中的initWithFrame辦法外部設置table的署理

// Initialization code
        self.delegate   = self;
        self.dataSource = self;

和添加tableViewFrame的set辦法

-(void)setTableViewFrame:(CGRect)tableViewFrame
{
    self.frame = tableViewFrame;// 設置tableView的frame為所傳值
}

④接上去完成tableView的dataSource和delegate辦法

必需完成的辦法有兩個

// tableView每一個分區的行數,可認為各個分區設置分歧的行數,依據section的值斷定便可
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_textLabel_MArray count];
}
 
// 完成每行Cell的內容,tableView重用機制
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 為其界說一個標識符,在重用機制中,標識符異常主要,這是體系用來婚配table各行cell的斷定尺度,在今後的進修中會領會到
    static NSString *cellIdentifier = @"cellIdentifier";
    
    // 從緩存隊列中掏出復用的cell
    UITableViewCell *cell           = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
    // 假如隊列中cell為空,即無復用的cell,則對其停止初始化
    if (cell==nil) {
        
        // 初始化
        cell                    = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        
        // 界說其幫助款式
        cell.AccessoryType      = UITableViewCellAccessoryNone;
    }
 
    // 設置cell上文本內容
    cell.textLabel.text         = [_textLabel_MArray objectAtIndex:indexPath.row];
    
    return cell;
}

⑤還有其他幫助辦法,依據須要添加

// tableView分區數目,默許為1,可為其設置為多個分區
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
 
// tableView頁眉的值,同理,可為分歧的分區設置分歧的頁眉,也可不寫此辦法
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return @"頁眉";
}
 
// 頁腳
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
    return @"頁腳";
}

⑥在所須要添加的ViewController中添加tableView,在ViewController.m辦法中

#import "general_table_view.h"
@interface ViewController ()
{
    general_table_view *table;// 聲明table
}
@end

並在ViewDidLoad辦法中對其停止初始化

// 初始化
table                   = [[general_table_view alloc] initWithFrame:CGRectMake(0, 20, 320, self.view.frame.size.height-20) style:UITableViewStylePlain];
 
// 設置數據源
table.textLabel_MArray  = [[NSMutableArray alloc] initWithObjects:@"南京市",@"南通市",@"淮安市",@"鎮江市",@"揚州市",@"常州市", nil];
 
 [self.view addSubview:table];// 添加到以後View

⑦運轉便可獲得圖5的後果,將初始化時的style改成UITableViewStyleGrouped便可獲得圖6的後果

// 初始化
    table                   = [[general_table_view alloc] initWithFrame:CGRectMake(0, 20, 320, self.view.frame.size.height-20) style:UITableViewStyleGrouped];

4、為每行添加圖片

在ViewController.m的ViewDidLoad辦法中設置數據源時,在addSubview之前,初始化一個寄存圖片的數組,這裡我添加的是統一張圖片,假如想為每行設置分歧的圖片,添加分歧的圖片到數組中便可

NSMutableArray *images  = [NSMutableArray array];
for(NSInteger index = 0;index<[table.textLabel_MArray count];index++){
    UIImage *image      = [UIImage imageNamed:@"2"];
        
    [images addObject:image];
}
table.images_MArray     = [[NSMutableArray alloc] initWithArray:images];

在CellForRowAtIndexPath辦法中設置textLabel值部門添加

// 設置cell上文本內容
    cell.textLabel.text         = [_textLabel_MArray objectAtIndex:indexPath.row];
// 設置每行的圖片
    cell.imageView.image        = [_images_MArray objectAtIndex:indexPath.row];

5、列表的其他款式

在CellForRowAtIndexPath辦法中,初始化Cell時轉變cell的style和AccessoryType,style,style默許有四種可選。

在ViewController的ViewDidLoad辦法中添加圖片的for輪回中為數組添加值

NSMutableArray *subtitle= [NSMutableArray array];
    
    for(NSInteger index = 0;index<[table.textLabel_MArray count];index++){
        
        UIImage *image      = [UIImage imageNamed:@"2"];
        
        NSString *detail    = [NSString stringWithFormat:@"detail text %d",index+1];
        
        [images addObject:image];
        
        [subtitle addObject:detail];
    }
table.subtitle_MArray   = [[NSMutableArray alloc] initWithArray:subtitle];

並在CellForRowAtIndexPath辦法初始化時將

UITableViewCellStyleDefault轉變成其他三種款式,並添加代碼

// 設置小題目
   cell.detailTextLabel.text   = [_subtitle_MArray objectAtIndex:indexPath.row];

後果圖以下:

201612194314852.png (320×568)201612194333280.png (320×568)

201612194409290.png (320×568)201612194421916.png (320×568)

6、列表中行的操作
1.選中行

    完成署理辦法

// 選中行
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"您點擊了第%d分區第%d行",indexPath.section, indexPath.row);
    
    // 撤消選中狀況
    // [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

2.刪除行

    要對行停止操作,起首要完成署理辦法

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    return YES;
}

    先講述零丁刪除一行數據,即左滑湧現刪除按鈕,並刪除行的操作,後文會引見多選批量刪除

201612194438332.png (320×568)

可重置刪除按鈕的題目,默許為"delete"

// 設置刪除按鈕題目
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return @"刪除";
}
點擊刪除後

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    // 從數據源中刪除
    [self.dataArray removeObjectAtIndex:indexPath.row];
    
    // 從列表中刪除
    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
   
}

3.拔出行

 ①這時候我將拔出行和刪除行都以一個按鈕舉措來觸發,點擊後tableView進入編纂形式,先上後果圖

201612194459745.png (320×568)201612194912499.png (320×568)

 ②在ViewDidLoad中添加代碼,個中self.addButton和self.deleteBarButtonItem均在storyBoard中創立,下文中的按鈕也是這類情形


NSArray *leftBarButtons = [NSArray arrayWithObjects:self.addButton,self.deleteBarButtonItem, nil];
    
self.navigationItem.leftBarButtonItems = leftBarButtons;//設置導航欄右邊按鈕為添加和刪除按鈕

 ③在@interface中聲明一個變量

UITableViewCellEditingStyle selectEditingStyle;

④兩個按鈕的點擊事宜

// 更新導航欄按鈕
-(void) updateBarButtons
{
    if (self.tableView.editing==YES) {
        self.navigationItem.rightBarButtonItem = self.doneBarButtonItem;
    }
}
// 點擊添加按鈕
- (IBAction)addButtonClicked:(id)sender {
    selectEditingStyle = UITableViewCellEditingStyleInsert;
    
    [self.tableView setEditing:YES animated:YES];
    
    [self updateBarButtons];
    
}
// 點擊刪除按鈕
- (IBAction)deleteButtonClicked:(id)sender {
    
    
    selectEditingStyle = UITableViewCellEditingStyleDelete;
    
    [self.tableView setEditing:YES animated:YES];
    
    [self updateBarButtons];
}

 ⑤完成響應的署理辦法

// 能否可編纂
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    return YES;
}
// 編纂形式
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return selectEditingStyle;
    
}
 
 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 刪除形式
    if (editingStyle==UITableViewCellEditingStyleDelete) {
        
        // 從數據源中刪除
        [self.dataArray removeObjectAtIndex:indexPath.row];
        // 刪除行
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    // 添加形式
    else if(editingStyle == UITableViewCellEditingStyleInsert){
        
        // 從數據源中添加
        [self.dataArray insertObject:@"new iPhone" atIndex:indexPath.row];
        
        // 添加行
        [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic ];
    }
   
}
// 點擊完成按鈕
- (IBAction)doneButtonClicked:(id)sender {
    
    [self.tableView setEditing:NO animated:YES];
    
    [self updateBarButtons];
}

4.挪動行

 ①後果圖

201612194936788.png (320×568)

 ②在tableView進入編纂形式時,可以對行停止挪動操作,經由過程辦法

// 能否支撐挪動
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
③設置行可挪動,並完成挪動行辦法,轉變數據源

// 挪動行操作-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{// 這裡其實就是數組中兩個變量交流地位的進程 id object = [self.dataArray objectAtIndex:fromIndexPath.row];
    
    [self.dataArray removeObjectAtIndex:fromIndexPath.row];
    
    [self.dataArray insertObject:object atIndex:toIndexPath.row];
}

5、批量刪除行

①即完成可以選擇多個行以後批量刪除,如圖

201612195014090.png (320×568)201612195026332.png (320×568)

②在ViewDidLoad中添加代碼

self.navigationItem.rightBarButtonItem = self.editBarButtonItem;// 在右導航欄中添加編纂按鈕
③如今須要到達,點擊編纂按鈕在右上角湧現撤消按鈕,左上角湧現刪除按鈕。並在選擇時,能湧現刪除行的數目,修正updateBarButtons辦法,並添加一個辦法來依據前提修正刪除按鈕的題目

// 更新導航欄按鈕
-(void) updateBarButtons
{
    // 假如是許可多選的狀況,即進入批量刪除形式
    if (self.tableView.allowsSelectionDuringEditing == YES) {
        //更新刪除按鈕
        [self updateDeleteButtonTitle];
        // 導航欄右邊按鈕設置為空
        self.navigationItem.leftBarButtonItems = nil;
        // 將右邊按鈕設置為'批量刪除'按鈕
        self.navigationItem.leftBarButtonItem = self.multiDeleteBarButton;
        // 導航欄右鍵設置為'撤消'鍵
        self.navigationItem.rightBarButtonItem = self.cancelBarButtonItem;
        
        return;
    }
    if (self.tableView.editing==YES) {// 假如是編纂狀況,且不屬於批量刪除狀況
        // 導航欄右鍵設置為'撤消'鍵
        self.navigationItem.rightBarButtonItem = self.doneBarButtonItem;
    }
    else {// 假如不是編纂狀況,將導航欄設置為初始狀況的款式,即左欄為'添加','刪除'按鈕,右欄為'編纂'按鈕
        NSArray *leftBarButtons = [NSArray arrayWithObjects:self.addButton,self.deleteBarButtonItem, nil];
        self.navigationItem.leftBarButtonItems = leftBarButtons;
        
        self.navigationItem.rightBarButtonItem = self.editBarButtonItem;
    }
}

// 更新刪除按鈕的題目
-(void)updateDeleteButtonTitle
{
    NSArray *selectedRows = [self.tableView indexPathsForSelectedRows];//獲得選中行
    
    BOOL allItemsAreSelected = selectedRows.count == self.dataArray.count;// 能否全選
    
    BOOL noItemsAreSelected = selectedRows.count == 0;// 選中行數能否為零
    
    if (allItemsAreSelected || noItemsAreSelected)
    {// 假如是全選或許未選,則刪除鍵為刪除全體
        self.multiDeleteBarButton.title = @"刪除全體";
    }
    else
    {// 不然 刪除鍵為刪除(選中行數目)
        self.multiDeleteBarButton.title = [NSString stringWithFormat:@"刪除 (%d)", selectedRows.count];
    }
 
}

④在

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
兩個辦法中挪用updateDeleteButtonTitle辦法

⑤點擊編纂按鈕時

// 編纂按鈕
- (IBAction)editButtonClicked:(id)sender { 
    self.tableView.allowsMultipleSelectionDuringEditing = YES;// 進入可多選刪除狀況
    
    [self.tableView setEditing:YES animated:YES];// 將table設置為可編纂
    
    [self updateBarButtons];  //更改導航欄的導航按鈕
}

⑥點擊刪除多個按鈕時

- (IBAction)multiDeleteClicked:(id)sender {
    // 選中的行
    NSArray *selectedRows = [self.tableView indexPathsForSelectedRows];
    
    // 能否刪除特定的行
    BOOL deleteSpecificRows = selectedRows.count > 0;
    // 刪除特定的行
    if (deleteSpecificRows)
    {
        // 將所選的行的索引值放在一個聚集中停止批量刪除
        NSMutableIndexSet *indicesOfItemsToDelete = [NSMutableIndexSet new];
        
        for (NSIndexPath *selectionIndex in selectedRows)
        {
            [indicesOfItemsToDelete addIndex:selectionIndex.row];
        }
        // 從數據源中刪除所選行對應的值
        [self.dataArray removeObjectsAtIndexes:indicesOfItemsToDelete];
        
        //刪除所選的行
        [self.tableView deleteRowsAtIndexPaths:selectedRows withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    else
    {
        // 刪除全體
        [self.dataArray removeAllObjects];
        
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    // 刪除完成,加入編纂狀況,並加入多選狀況,同時更新導航欄的按鈕
    [self.tableView setEditing:NO animated:YES];
    
    self.tableView.allowsMultipleSelectionDuringEditing = NO;
    
    [self updateBarButtons];
}

【講授iOS開辟中UITableView列表設計的根本要點】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved