IOS編程教程(七):用屬性列表(Property List)來完善你的程序


哇又到了iOS編程教程的時間嘍。在前面幾此教程里,我們已經建立了一個非常簡單的表格應用程序來顯示食譜列表。如果你回頭看看那個應用程序,你會發現所有的食譜都是直接在源代碼中賦值的。以前我盡量保持事情的簡單,主要集中展示了如何創建一個UITableView並使用它。然而,這不是一個很好的做法。在真正的應用程序中,對於用到的外在靜態項目(即菜單信息),我們是把它們放在一個文件或數據庫中或其他地方。在iOS編程,有一種這種類型文件叫做屬性列表(Property List)。在Mac OS和iOS,這種文件通常用於存儲簡單的結構化數據(如應用程序設置)。在本教程中,我們將在我們的簡單的表格應用程序里作出一些改變,調整它使它能夠使用屬性列表來存菜單數據。

簡單地說,這里有這么一些東西,我們將討論:

>如何把靜態數據轉換為屬性列表

>如何從屬性列表讀取數據

為什么要分離數據

把靜態數據轉換到外部是個很好的做法。但是,為什么呢?把表中的數據轉換到外部源的優點是什么?讓我們問你,在我們的簡單的表格應用程序中添加50個配方。也許,你會回到你的代碼,並初始化所有新的食譜:

1
2
3
4
5
6
7
8
     // Initialize table data
    tableData   =   [ NSArray  arrayWithObjects : @ "Egg Benedict",   @ "Mushroom Risotto",   @ "Full Breakfast",   @ "Hamburger",   @ "Ham and Egg Sandwich",   @ "Creme Brelee",   @ "White Chocolate Donut",   @ "Starbucks Coffee",   @ "Vegetable Curry",   @ "Instant Noodle with Egg",   @ "Noodle with BBQ Pork",   @ "Japanese Noodle with Pork",   @ "Green Tea",   @ "Thai Shrimp Cake",   @ "Angry Birds Cake",   @ "Ham and Cheese Panini",   nil ];
    
     // Initialize thumbnails
    thumbnails   =   [ NSArray  arrayWithObjects : @ "egg_benedict.jpg",   @ "mushroom_risotto.jpg",   @ "full_breakfast.jpg",   @ "hamburger.jpg",   @ "ham_and_egg_sandwich.jpg",   @ "creme_brelee.jpg",   @ "white_chocolate_donut.jpg",   @ "starbucks_coffee.jpg",   @ "vegetable_curry.jpg",   @ "instant_noodle_with_egg.jpg",   @ "noodle_with_bbq_pork.jpg",   @ "japanese_noodle_with_pork.jpg",   @ "green_tea.jpg",   @ "thai_shrimp_cake.jpg",   @ "angry_birds_cake.jpg",   @ "ham_and_cheese_panini.jpg",   nil ];
    
     // Initialize Preparation Time
    prepTime   =   [ NSArray  arrayWithObjects : @ "30 min",   @ "30 min",   @ "20 min",   @ "30 min",   @ "10 min",   @ "1 hour",   @ "45 min",   @ "5 min",   @ "30 min",   @ "8 min",   @ "20 min",   @ "20 min",   @ "5 min",   @ "1.5 hour",   @ "4 hours",   @ "10 min",   nil ];

這樣做是沒有錯。但看代碼,這是不容易編輯的,你必須嚴格遵循客觀的C語法。更改代碼可能會意外地引入其他錯誤。這不是我們想要的。顯然,這將是更好地分離數據和編程邏輯(即代碼)。像下面那樣存儲,看起來不是會更好么?

樣品財產清單

簡單屬性列表

在現實中,你可能不是一個自己提供的數據(在這里是食譜信息)。這些信息可能是別人給的,他可能沒有iOS的編程經驗。當我們把數據放到外部文件時,它將變得更容易閱讀/編輯,更容易理解。

隨着你的進一步學習,你將學習到如何把數據放到在服務器端(或所謂的雲)或從服務器端讀取數據。您的應用程序中所有數據按需從服務器推送。它提供了一個很大的好處。現在,如果你的程序有的數據有任何細小的變化都必須從新提交到Apple,並被蘋果審批。但是。如果你把數據和程序分離,並把數據放在雲中,那么你可以隨時隨地更改數據而不用經蘋果的同意。

今天我們不會談論雲。讓我們回到基本,看看你如何把所有的食譜數據放在一個屬性列表中。

什么是屬性列表

屬性列表提供了一個方便的方式來存儲簡單的結構化數據。它是以XML格式存儲的。如果您在MAC或iphone上修改過一些配置文件,你可能會遇到.plist擴展名的文件。它們就是屬性列表的例子。

您不能使用屬性列表保存所有類型的數據。在屬性列表中的項目的數據類型,包括“數組(array)”,“字典(Dictionary)”,“字符串(String)”,等等。對應詳細的支持類型,你可以參考官方關於屬性列表文件的介紹

屬性列表常被IOS用於保存應用程序設置屬性,但這並不意味着你不使用它到其他用途。但它是被設計用於存儲少量的數據。

那么什么是存儲數據最好的方式呢

現在還不確定。下面讓我們使用屬性列表來演示如何表中的數據存儲在一個外部文件中。這只是一個例子。當你獲得更多的經驗,你會學習其他的方式來存儲數據。

將表數據轉換到屬性列表中

理論知識講得差不多了,讓我們開始着手,將數據轉換成一個屬性列表。首先,在Xcode項目打開簡單表程序,就是以前的程序了。在“SimpleTable”文件夾上單擊鼠標右鍵,並選擇“New File ...”。選擇“Other”下的“IOS”模板,選擇“屬性列表(Proper List)”,然后單擊“下一步”繼續。

Xcode的新屬性列表文件

創建一個新的屬性列表文件

出現提示時,使用“recipes(配方)”作為文件名。一旦您確認,Xcode會為你創建屬性列表文件。默認情況下,屬性列表是空的。

Xcode的配方PLIST

空的屬性列表

有兩種方法來編輯屬性列表。您可以用鼠標右鍵單擊編輯區,然后選擇“添加行”,添加一個新的值。

Xcode的屬性列表添加行

在屬性列表編輯器中添加一個新行

下面我們把三個數據數組添加到屬性列表中,我們將添加3行“數組”類型。將它們命名為:recipename,Thumbnail和PrepTime。作為標識符的關鍵字,以后你就可以使用它在你的代碼中來選擇相應的數組。

SimpleTableApp財產清單陣列

在屬性列表中定義三個數組

要往數組中添加數據,你先展開它,然后單擊“+”圖標,添加一個新的項目。如果你不知道該怎么辦,按照下面的說明中的步驟,

在屬性列表中添加屬性

逐步操作過程中添加項目的Array

重復上述過程,直到你添​​加所有的值到數組。你的菜單清單應該是這樣的:

SimpleTableApp配方屬性列表

菜單屬性列表

正如前面提到的,通常保存在屬性列表數據是XML格式。要查看源代碼的屬性列表,單擊右鍵,選擇“打開源代碼”。

打開屬性列表作為源代碼

查看源代碼的屬性列表

“recipes.plist”文件的源代碼,會出現這樣的:

屬性列表源代碼

源代碼Recipes.plist

在Object C中導入屬性列表

接下來,我們將改變我們的代碼,在從我們剛剛建立的屬性列表中加載菜單。這是很容易的去得到屬性列表的內容。iOS的SDK已經自帶了一些內置的功能來處理讀/寫文件。

更改下面的代碼:

1
2
3
4
5
6
7
8
// Initialize table data
    tableData   =   [ NSArray  arrayWithObjects : @ "Egg Benedict",   @ "Mushroom Risotto",   @ "Full Breakfast",   @ "Hamburger",   @ "Ham and Egg Sandwich",   @ "Creme Brelee",   @ "White Chocolate Donut",   @ "Starbucks Coffee",   @ "Vegetable Curry",   @ "Instant Noodle with Egg",   @ "Noodle with BBQ Pork",   @ "Japanese Noodle with Pork",   @ "Green Tea",   @ "Thai Shrimp Cake",   @ "Angry Birds Cake",   @ "Ham and Cheese Panini",   nil ];
    
     // Initialize thumbnails
    thumbnails   =   [ NSArray  arrayWithObjects : @ "egg_benedict.jpg",   @ "mushroom_risotto.jpg",   @ "full_breakfast.jpg",   @ "hamburger.jpg",   @ "ham_and_egg_sandwich.jpg",   @ "creme_brelee.jpg",   @ "white_chocolate_donut.jpg",   @ "starbucks_coffee.jpg",   @ "vegetable_curry.jpg",   @ "instant_noodle_with_egg.jpg",   @ "noodle_with_bbq_pork.jpg",   @ "japanese_noodle_with_pork.jpg",   @ "green_tea.jpg",   @ "thai_shrimp_cake.jpg",   @ "angry_birds_cake.jpg",   @ "ham_and_cheese_panini.jpg",   nil ];
    
     // Initialize Preparation Time
    prepTime   =   [ NSArray  arrayWithObjects : @ "30 min",   @ "30 min",   @ "20 min",   @ "30 min",   @ "10 min",   @ "1 hour",   @ "45 min",   @ "5 min",   @ "30 min",   @ "8 min",   @ "20 min",   @ "20 min",   @ "5 min",   @ "1.5 hour",   @ "4 hours",   @ "10 min",   nil ];

變成:

1
2
3
4
5
6
7
8
     // Find out the path of recipes.plist
     NSString   *path   =   [ [ NSBundle  mainBundle ]  pathForResource : @ "recipes"  ofType : @ "plist" ];    

     // Load the file content and read the data into arrays
     NSDictionary   *dict   =   [ [ NSDictionary  alloc ]  initWithContentsOfFile :path ];
    tableData   =   [dict objectForKey : @ "RecipeName" ];
    thumbnails   =   [dict objectForKey : @ "Thumbnail" ];
    prepTime   =   [dict objectForKey : @ "PrepTime" ];
 

代碼里的改變

第2行 -讀取“recipes.plist”文件之前,你必須先得到資源路徑。

第5行--您已經定義了三個關鍵字(RecipeName,Thumbnail,PrepTime)的。在該示例中,每個關鍵字對應一個特定的數組。使用路徑得到屬性列表的數據,並存到字典中。

第6-8 -這些代碼行中通過我們前面定義的關鍵字檢索相應的數組。 

一旦你完成更改后,再次嘗試運行的應用程序。這個應用程序是像以前一樣。但是,在內部從屬性清單的食譜加載。

SimpleTable應用程序與自定義單元格的准備時間


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com