UI-10-plist文件及UITableView的高級應用①

課程要點:數組

  • plist文件的新建與讀取
  • 給UITableView設置變化的值
  • 單元格的刪除、插入及刷新

    

   plist文件的新建與讀取app

   新建plistspa

   Commadn+N,iOS->Resouce->Property List代理

   

   

    

   plist文件還有另一種展示形式code

  右鍵plist文件,open as->Property List就是上面顯示的這種方式來展示, open as->source Code 就是下面這種方式來展示xml

   

 

    這種形式下我能夠經過改變代碼或者增長代碼給plist修改或增長數據。對象

   讀取plist數據blog

  爲了我們的數據統一,我把個人plist裏的代碼留下。圖片

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>DataArray</key>
    <array>
        <dict>
            <key>age</key>
            <integer>16</integer>
            <key>name</key>
            <string>王五</string>
        </dict>
        <dict>
            <key>name</key>
            <string>張三</string>
            <key>age</key>
            <integer>18</integer>
        </dict>
        <dict>
            <key>name</key>
            <string>李四</string>
            <key>age</key>
            <integer>19</integer>
        </dict>
        <dict>
            <key>age</key>
            <integer>16</integer>
            <key>name</key>
            <string>趙六</string>
        </dict>
    </array>
</dict>
</plist>

 

    讀取plist文件分兩步開發

    一、找到plist文件在boundle中的路徑,

    二、使用字典讀取該文件    

    boundles:iOS的應用都是經過bundle進行封裝的,對應的bundle類型是Application類型,平時咱們經過XCode編譯出來的Target(即咱們開發的應用),其實就是一個Application類型bundle,即一個文件夾!

 

    //獲取到新建plist文件的路徑。 第一個參數是文件的名字 第二個參數是文件的後綴
NSString *path = [[NSBundle mainBundle] pathForResource:@"DataPlist" ofType:@"plist"]; //經過字典獲取到plist文件的內容(plist文件的最頂層是字典) NSDictionary *dict = [[NSDictionary alloc]initWithContentsOfFile:path]; //輸出內容 NSLog(@"數據=%@",dict);

  運行後控制檯輸出:

[7713:503574] 數據={
    DataArray =     (
                {
            age = 16;
            name = "\U738b\U4e94";
        },
                {
            age = 18;
            name = "\U5f20\U4e09";
        },
                {
            age = 19;
            name = "\U674e\U56db";
        },
                {
            age = 16;
            name = "\U8d75\U516d";
        }
    );
}

 

     

         獲取到plist文件中的DataArray數組。

    //經過mutableCopy將不可變數組,轉變爲可變數組
NSMutableArray *dataArray = [dict[@"DataArray"] mutableCopy]; NSLog(@"DataArray=%@",dataArray);

   

  給UITableView設置變化的值
//
//  ViewController.m
//  Plist文件以及cell的增長與刪除
//
//  Created by 王立廣 on 15/12/14.
//  Copyright © 2015年 王立廣. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    //UITableView的數據源
    NSMutableArray *dataArray;
    
    UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //獲取到plist文件路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"DataPlist" ofType:@"plist"];
    //經過字典獲取到plist文件中的字典
    NSDictionary *dict = [[NSDictionary alloc]initWithContentsOfFile:path];
    
    NSLog(@"數據=%@",dict);
    
    //將plist文件中的數組賦值給工程中的數據源數組
    dataArray = [dict[@"DataArray"] mutableCopy];
    
    _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 50, 414, 480) style:UITableViewStylePlain];
    
    _tableView.delegate = self;
    _tableView.dataSource = self;
    
    _tableView.backgroundColor = [UIColor grayColor];
    
    [self.view addSubview:_tableView];
    

    
}

//給tableView設置行數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
    //數據源數組裏面有幾個元素,裏面就有幾行
    return dataArray.count;
}

//每次將要顯示cell,就會調用這個方法,在這個方法內設置一個cell並返回就會就將cell放到tableView上面,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    /*
     * 這個方法會傳進來兩個參數
     
     * tableView:就是我們正在操做的tableView
    
     * indexPath:這個值有兩個屬性section和row,分別標明這個cell位於第幾段第幾行
     
     */
    
    static NSString *cellID = @"cellID";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    
    if (cell == nil) {
        
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
    }
    
    cell.backgroundColor = [UIColor yellowColor];
    
    
    //利用傳進來的indexpath參數,來分別取數組裏相應的字典,在經過key值獲得我們真正須要的數據
    cell.textLabel.text = dataArray[indexPath.row][@"name"];
    cell.detailTextLabel.text = [dataArray[indexPath.row][@"age"] stringValue];
    
    return cell;
    
}


@end
單元格的刪除、插入及刷新
UITableView有兩種模式
一、正常模式
二、編輯模式
1)插入狀態
2)刪除狀態

左邊是正常模式,中間是編輯模式下的刪除狀態,只要點擊紅色的減號,單元格右邊就會出現刪除按鈕,如第三張圖片所示。

一、獲取到tableView編譯模式,tableView是UITableView的一個對象
tableView.iSEditing 
 
二、給tableVIew設置編輯模式
[tableView setEditing:YES animated:YES];

三、只要進入編輯模式,系統就會自動調用這個方法來詢問是要進入編輯模式下的刪除狀態仍是插入狀態。若是不實現這個方法,系統默認是刪除狀態。
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //這兩種你能夠都試試,看一下效果,但最終要選擇刪除模式,
    return UITableViewCellEditingStyleDelete;
//    return UITableViewCellEditingStyleInsert;
    
}

  四、進入編輯模式後,經過上面的代理方法進入相應的狀態,此時無論你點擊的是刪除按鈕仍是插入按鈕,都會進入下面這個方法。實現這個方法直接右劃也能夠出現右邊的刪除按鈕

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    
    /*
        若是點擊的是刪除按鈕,editingStyle參數就是UITableViewCellEditingStyleDelete
     
        若是點擊的是插入按鈕,editingStyle參數就是UITableViewCellEditingStyleInsert
     
        indexPath:可以得到你點擊是哪一行哪一段。
     
     
     */
    
    //經過判斷你點擊的是刪除仍是插入作不一樣的操做
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //刪除dataArray中相應cell的數據
        [dataArray removeObjectAtIndex:indexPath.row];
        //刪除cell
        [tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationTop];
    }else if (editingStyle == UITableViewCellEditingStyleInsert){

        NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];
        tempDict[@"name"] = @"小閃";
        tempDict[@"age"] = @(18);

//在數據源數組中增長一個字典

          [dataArray insertObject:tempDict atIndex:indexPath.row];

        //插入一個cell

          [tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];


    }
    
    
}

完整代碼以下:

//
//  ViewController.m
//  Plist文件以及cell的增長與刪除
//
//  Created by 王立廣 on 15/12/14.
//  Copyright © 2015年 王立廣. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    //UITableView的數據源
    NSMutableArray *dataArray;
    
    UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //獲取到plist文件路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"DataPlist" ofType:@"plist"];
    
    //經過字典獲取到plist文件中的字典
    NSDictionary *dict = [[NSDictionary alloc]initWithContentsOfFile:path];
    
    NSLog(@"數據=%@",dict[@"DataArray"][1][@"name"]);
    
    //將plist文件中的數組賦值給工程中的數據源數組
    dataArray = [dict[@"DataArray"] mutableCopy];
    
    
    _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 50, 414, 480) style:UITableViewStylePlain];
    
    _tableView.delegate = self;
    _tableView.dataSource = self;
    
    _tableView.backgroundColor = [UIColor grayColor];
    
    [self.view addSubview:_tableView];
    
    
    //在底部添加toolBar
    UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 680, 414, 56)];
    
    toolBar.backgroundColor = [UIColor grayColor];
    
    [self.view addSubview:toolBar];
    
    UIBarButtonItem *trash = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(trash)];
    
    //在toolBar上面加一個刪除按鈕
    toolBar.items = @[trash];
    
}

- (void)trash{
    
    //tableView.iSEditing得到tableView是否屬於編輯模式,經過取反來改變tableView的編輯模式
    BOOL kbool = !_tableView.isEditing;
    
    // tableView setEditing給tableView設置編輯模式
    [_tableView setEditing:kbool animated:YES];
}

//只要進入編輯模式,系統就會自動調用這個方法來詢問是要進入編輯模式下的刪除狀態仍是插入狀態。若是不實現這個方法,系統默認是刪除狀態。
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //這兩種你能夠都試試,看一下效果
    return UITableViewCellEditingStyleDelete;
//    return UITableViewCellEditingStyleInsert;
    
}

//進入編輯模式後,經過上面的代理方法進入相應的狀態,此時無論你點擊的是刪除按鈕仍是插入按鈕,都會進入下面這個方法。實現這個方法直接右劃也能夠出現右邊的刪除按鈕
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    
    /*
        若是點擊的是刪除按鈕,editingStyle參數就是UITableViewCellEditingStyleDelete
     
        若是點擊的是插入按鈕,editingStyle參數就是UITableViewCellEditingStyleInsert
     
        indexPath:可以得到你點擊是哪一行哪一段。
     
     
     */
    
    //經過判斷你點擊的是刪除仍是插入作不一樣的操做
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //刪除dataArray中相應cell的數據
        [dataArray removeObjectAtIndex:indexPath.row];
        

           //刪除cell時,沒有執行cellForRowAtIndexPath方法

        [tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationTop];
    }else if (editingStyle == UITableViewCellEditingStyleInsert){
        
        NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];
        tempDict[@"name"] = @"小閃";
        tempDict[@"age"] = @(18);
 //在數據源數組中增長一個字典
       [dataArray insertObject:tempDict atIndex:indexPath.row];

//插入一個cell
 [tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];
   }
    
    
}

//給tableView設置行數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    //數據源數組裏面有幾個元素,裏面就有幾行
    return dataArray.count;
}

//每次將要顯示cell,就會調用這個方法,在這個方法內設置一個cell並返回就會就將cell放到tableView上面,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //用static修飾的變量只會初始化一次。
    static NSString *cellID = @"cellID";
    
    /*
     * 這個方法會傳進來兩個參數
     
     * tableView:就是我們正在操做的tableView
     
     * indexPath:這個值有兩個屬性section和row,分別標明這個cell位於第幾段第幾行
     
     */

    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    
    if (cell == nil) {
        
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
    }
    
    cell.backgroundColor = [UIColor yellowColor];
    cell.textLabel.text = dataArray[indexPath.row][@"name"];
    cell.detailTextLabel.text = [dataArray[indexPath.row][@"age"] stringValue];
    
    return cell;
    
}


@end
 
PS:我們在刪除cell的同時也在數組中刪除了cell所對應的數據。並無刪除plist文件中的內容。

單元格的刷新

改動有三:
一、將存放plist數據的字典設置爲全局變量
二、在toolBar上新增了一個refresh按鈕
三、在refresh按鈕的觸發方法裏,從新給數據源數組賦值,而後使用UITableView的
reloadData方法刷新表格。
PS:reloadData刷新的意思是tableView的全部代理方法重走。從新計算多少行,從新設置cell等等。。。。


//
//  ViewController.m
//  Plist文件以及cell的增長與刪除
//
//  Created by 王立廣 on 15/12/14.
//  Copyright © 2015年 王立廣. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    //UITableView的數據源
    NSMutableArray *dataArray;
    
    UITableView *_tableView;
    //從plist文件中取出來的字典
    NSDictionary *dict;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //獲取到plist文件路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"DataPlist" ofType:@"plist"];
    
    //經過字典獲取到plist文件中的字典
    dict = [[NSDictionary alloc]initWithContentsOfFile:path];
    
    NSLog(@"數據=%@",dict[@"DataArray"][1][@"name"]);
    
    //將plist文件中的數組賦值給工程中的數據源數組
    dataArray = [dict[@"DataArray"] mutableCopy];
    
    
    _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 50, 414, 480) style:UITableViewStylePlain];
    
    _tableView.delegate = self;
    _tableView.dataSource = self;
    
    _tableView.backgroundColor = [UIColor grayColor];
    
    [self.view addSubview:_tableView];
    
    
    //在底部添加toolBar
    UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 680, 414, 56)];
    
    toolBar.backgroundColor = [UIColor grayColor];
    
    [self.view addSubview:toolBar];
    
    UIBarButtonItem *trash = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(trash)];
    
  UIBarButtonItem *refresh = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)]; //在toolBar上面加一個刪除按鈕
    toolBar.items = @[trash,refresh];     
}
- (void)refresh{ dataArray = [dict[@"DataArray"] mutableCopy]; [_tableView reloadData]; } - (void)trash{
    
    //tableView.iSEditing得到tableView是否屬於編輯模式,經過取反來改變tableView的編輯模式
    BOOL kbool = !_tableView.isEditing;
    
    // tableView setEditing給tableView設置編輯模式
    [_tableView setEditing:kbool animated:YES];
}

//只要進入編輯模式,系統就會自動調用這個方法來詢問是要進入編輯模式下的刪除狀態仍是插入狀態。若是不實現這個方法,系統默認是刪除狀態。
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //這兩種你能夠都試試,看一下效果,
    return UITableViewCellEditingStyleDelete;
//    return UITableViewCellEditingStyleInsert;
    
}

//進入編輯模式後,經過上面的代理方法進入相應的狀態,此時無論你點擊的是刪除按鈕仍是插入按鈕,都會進入下面這個方法。實現這個方法直接右劃也能夠出現右邊的刪除按鈕
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    
    /*
        若是點擊的是刪除按鈕,editingStyle參數就是UITableViewCellEditingStyleDelete
     
        若是點擊的是插入按鈕,editingStyle參數就是UITableViewCellEditingStyleInsert
     
        indexPath:可以得到你點擊是哪一行哪一段。
     
     
     */
    
    //經過判斷你點擊的是刪除仍是插入作不一樣的操做
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //刪除dataArray中相應cell的數據
        [dataArray removeObjectAtIndex:indexPath.row];
        
        //刪除cell時,沒有執行cellForRowAtIndexPath方法
        [tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationTop];
    }else if (editingStyle == UITableViewCellEditingStyleInsert){
        
        NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];
 
 
        tempDict[@"name"] = @"小閃";
 
 
        tempDict[@"age"] = @(18);

//在數據源數組中增長一個字典
        [dataArray insertObject:tempDict atIndex:indexPath.row];
 
 
        //插入一個cell

         [tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];

 

 } } //給tableView設置行數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ //數據源數組裏面有幾個元素,裏面就有幾行
    return dataArray.count; } //每次將要顯示cell,就會調用這個方法,在這個方法內設置一個cell並返回就會就將cell放到tableView上面,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ //用static修飾的變量只會初始化一次。
    static NSString *cellID = @"cellID"; /* * 這個方法會傳進來兩個參數 * tableView:就是我們正在操做的tableView * indexPath:這個值有兩個屬性section和row,分別標明這個cell位於第幾段第幾行 */ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID]; } cell.backgroundColor = [UIColor yellowColor]; cell.textLabel.text = dataArray[indexPath.row][@"name"]; cell.detailTextLabel.text = [dataArray[indexPath.row][@"age"] stringValue]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 59; } @end
相關文章
相關標籤/搜索