iOS操作屬性列表plist(增刪改查)

Cloudox_發表於2015-08-18

摘要:

iOS的儲存方式之一——屬性列表plist,還是經常見到的,可以很方便的用來管理一些有序的批量資料,特別是用來顯示固定的內容到表單上時,不需要在程式碼中反覆地繁瑣編寫陣列,而可以在plist屬性列表中進行視覺化操作,極為便捷,本文講解如何建立和使用plist列表,並顯示在表單上。

達到下面的效果:




建立plist屬性列表檔案:

首先我們新建一個Single View的工程,這樣就有可以直接使用的storyboard和ViewController檔案,然後建立一個屬性列表檔案。

在Xcode左側的工程檔案列表中,找一個你喜歡的位置,一般在Supporting Files資料夾內,新建我們的plist檔案,方法是右鍵選擇New File...或者按command+N鍵開啟新建檔案的視窗,在OS X的Resource中找到Property List型別檔案:



建立後會得到一個plist檔案,初始如下:



可以看到有三列:Key、Type、Value,分別表示鍵名、型別和值,這裡的初始型別是一個Dictionary,我們先改成陣列Array的型別。

PS:看到別的教程都說可以改變鍵的名字來根據鍵找到對應的屬性,String型別的也一樣,但我卻找不到方法改,用xml方式改也是說錯誤,只能用陣列的形式來根據位置找,求高人指點



如上圖,保證最左邊那個三角形箭頭是往下的,這表示你開啟了Root這個陣列在其下進行操作,否則就表示同級操作,點選那個加號,就可以在陣列內新增資料,如果最左邊的三角形不是往下的,那點選加號則會再建立一個新的平級的量。

這裡我們在陣列內新增三條資料,型別為String型,值如圖設定:



這樣我們的plist屬性列表就設定好了,這種視覺化操作非常方便,但其實plist的本質是一個xml檔案,我們可以在xml形式下檢視修改也是一樣的,方法是對右鍵點選plist檔案,選擇Open As --> Source Code,就可以看到了,如圖:



在這裡更改也是可以的,我們還是回到plist的顯示方式,方法還是跟剛才一樣。


在storyboard中新增Table View:

我們開啟storyboard檔案,在右下方的控制元件列表中,找到Table View,拖動到storyboard裡的檢視中去,如圖:



選擇右側最右邊的關聯部分,把Table View的dataSource和delegate都關聯到我們的ViewController中去,同時,把Table View本身也關聯到ViewController.h中去建立一個Outlet變數,這樣就可以在程式碼中操作這個Table View了,效果如圖:



程式碼實現對plist的操作並顯示到Table View:

1、準備工作

先開啟.h檔案,新增TableView的資料來源和協議委託,並建立一個儲存plist中陣列內容的可變陣列:

//ViewController.h檔案中

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> // 新增TableView委託
@property (strong, nonatomic) NSMutableArray *listData;// 用來儲存plist內容
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end


2、讀取plist檔案

我們通過plist檔名來找到檔案,把路徑儲存在變數path中,然後用一個陣列獲取plist檔案中的內容,並轉移到我們剛才建立的用來儲存plist內容的變數中去:

	//ViewController.m檔案中

    // 讀取plist
    NSString *path = [[NSBundle mainBundle] pathForResource:@"List" ofType:@"plist"];// 找到plist檔案
    NSArray *array = [[NSArray alloc] initWithContentsOfFile:path];// 獲取檔案列表
    self.listData = [NSMutableArray arrayWithArray:array];
    NSLog(@"%@", self.listData);


3、設定Table View的資料來源

這裡只要簡單地提供表單的行數一級每一行的內容就可以了,我們通過剛才的陣列,通過行數來獲取對應位置的plist內容:

	//ViewController.m檔案中

#pragma mark TableView Data Source Methods
// 表單的行數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.listData count];
}

// 表單每行的內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleTableIdentifier];
    }
    NSUInteger row = [indexPath row];
    // 通過行數來返回對應位置的plist內容
    cell.textLabel.text = [self.listData objectAtIndex:row];
    return cell;
}


4、去除列表多餘線條

這裡提供一個簡單的方法直接去除多餘的表單線條,在viewDidLoad方法中:

    //ViewController.m檔案中

    // 去除多餘表單線條
    self.tableView.tableFooterView = [[UIView alloc]init];

原理也不是很懂,求高人指點

效果如圖:



5、新增plist內容

要增加plist內容,我們只要先在剛才儲存的可變陣列中新增內容,然後把這個可變陣列寫入到原檔案位置就好了,然後重新讀取顯示:

    //ViewController.m檔案中

    // 新增plist內容
    [self.listData addObject:@"java"];
    [self.listData writeToFile:path atomically:YES];// 寫入檔案
    array = nil;
    array = [[NSArray alloc] initWithContentsOfFile:path];// 重新獲取
    NSLog(@"%@", array);
    [self.listData removeAllObjects];
    [self.listData addObjectsFromArray:array];
    [self.tableView reloadData];// 重置表單

效果如圖:



6、刪除plist內容

同新增的思路一樣,同樣也是先操作可變陣列,刪除某個位置的內容,然後將可變陣列存入原位置,再重新讀取顯示:

    //ViewController.m檔案中

    // 刪除plist內容
    [self.listData removeObjectAtIndex:2];
    [self.listData writeToFile:path atomically:YES];// 寫入檔案
    array = nil;
    array = [[NSArray alloc] initWithContentsOfFile:path];// 重新獲取
    NSLog(@"%@", array);
    [self.listData removeAllObjects];
    [self.listData addObjectsFromArray:array];
    [self.tableView reloadData];// 重置表單

效果如圖:



7、修改plist內容

還是一樣的思路,修改可變陣列某個位置的內容,存入原位置,重新讀取顯示:

    //ViewController.m檔案中

    // 修改plist內容
    [self.listData replaceObjectAtIndex:2 withObject:@"database"];
    [self.listData writeToFile:path atomically:YES];// 寫入檔案
    array = nil;
    array = [[NSArray alloc] initWithContentsOfFile:path];// 重新獲取
    NSLog(@"%@", array);
    [self.listData removeAllObjects];
    [self.listData addObjectsFromArray:array];
    [self.tableView reloadData];// 重置表單

效果如圖:



對於plist的基本操作就是這樣啦,還是蠻方便的。

這裡有我的原始碼:https://github.com/Cloudox/PlistTest



轉載請註明出處,謝謝

相關文章