【讀書筆記】iOS-iOS開發之iOS程式偏好設置(Settings Bundle)的使用

来源:https://www.cnblogs.com/yang-guang-girl/archive/2018/04/17/8861458.html
-Advertisement-
Play Games

在Android手機上, 在某個程式里,通過按Menu鍵,一般都會打開這個程式的設置,而在iOS里,系統提供了一個很好的保存程式設置的機制。就是使用Settings Bundle。 在按了HOME鍵的情況下,在第一頁的圖標中找到設置,會看到程式的設置都在這裡。那如何添加自己的程式的設置項呢? 1、添 ...


在Android手機上, 在某個程式里,通過按Menu鍵,一般都會打開這個程式的設置,而在iOS里,系統提供了一個很好的保存程式設置的機制。就是使用Settings Bundle。

在按了HOME鍵的情況下,在第一頁的圖標中找到設置,會看到程式的設置都在這裡。那如何添加自己的程式的設置項呢?

 

1、添加設置項

預設情況下,新建的項目程式是沒有設置項的。新建一個項目,命名為 SettingsBundleDemo,選擇Single View App模版創建。項目創建完成,在項目里選擇創建新文件,

選擇Resource 中的Settings Bundle,創建。

 

 

再給程式添加一個icon。運行。按home鍵,打開設置,看到設置里多了一項,SettingsBundleDemo。這就為程式添加了一個設置。

 

2、設置的控制項

預設的生成的設置項里有這個幾個控制項。

分別是:Group分組,文本框,Slider,開關控制項幾個控制項。

設置想能使用的控制項如下:

 

設置控制項類型
文本框 PSTextFieldSpecifier
文字 PSTitleValueSpecifier
開關控制項 PSToggleSwitchSpecifier
Slider PSSliderSpecifier
Multivalue PSMultiValueSpecifier
Group PSGroupSpecifier
子面板 PSChildPaneSpecifier.

 

 

3、編輯設置項的文件

展開Settings.bundle,其中包含一個Root.plist。Settings程式中的顯示項就是從Root.plist中獲取的。單擊Root.plist以打開它,在空白處單擊,選中Show Raw Keys/Values:

我們把原有的項刪掉,添加自己的設置項,添加如下:

對應的plist源文件是這樣的:如果你覺得自己手工輸入這些項很慢,可以把下麵的源文件拷貝到Root.plist里,用源代碼打開方式就可以編輯了。

 

[html] view plain copy  
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
  3. <plist version="1.0">  
  4. <dict>  
  5.     <key>PreferenceSpecifiers</key>  
  6.     <array>  
  7.         <dict>  
  8.             <key>Type</key>  
  9.             <string>PSGroupSpecifier</string>  
  10.             <key>Title</key>  
  11.             <string>個人信息</string>  
  12.             <key>Key</key>  
  13.             <string></string>  
  14.         </dict>  
  15.         <dict>  
  16.             <key>Type</key>  
  17.             <string>PSTextFieldSpecifier</string>  
  18.             <key>Title</key>  
  19.             <string>姓名</string>  
  20.             <key>Key</key>  
  21.             <string>username</string>  
  22.         </dict>  
  23.         <dict>  
  24.             <key>Type</key>  
  25.             <string>PSMultiValueSpecifier</string>  
  26.             <key>Values</key>  
  27.             <array>  
  28.                 <string>football</string>  
  29.                 <string>basketball</string>  
  30.                 <string>pingpong</string>  
  31.             </array>  
  32.             <key>Title</key>  
  33.             <string>愛好</string>  
  34.             <key>Titles</key>  
  35.             <array>  
  36.                 <string>足球</string>  
  37.                 <string>籃球</string>  
  38.                 <string>乒乓球</string>  
  39.             </array>  
  40.             <key>Key</key>  
  41.             <string>aihao</string>  
  42.             <key>DefaultValue</key>  
  43.             <string>football</string>  
  44.         </dict>  
  45.         <dict>  
  46.             <key>FalseValue</key>  
  47.             <string>NO</string>  
  48.             <key>TrueValue</key>  
  49.             <true/>  
  50.             <key>DefaultValue</key>  
  51.             <false/>  
  52.             <key>Type</key>  
  53.             <string>PSToggleSwitchSpecifier</string>  
  54.             <key>Title</key>  
  55.             <string>婚姻狀況</string>  
  56.             <key>Key</key>  
  57.             <string>maritalStatus</string>  
  58.         </dict>  
  59.         <dict>  
  60.             <key>Type</key>  
  61.             <string>PSGroupSpecifier</string>  
  62.             <key>Title</key>  
  63.             <string>等級</string>  
  64.             <key>Key</key>  
  65.             <string></string>  
  66.         </dict>  
  67.         <dict>  
  68.             <key>DefaultValue</key>  
  69.             <integer>5</integer>  
  70.             <key>MaximumValue</key>  
  71.             <integer>10</integer>  
  72.             <key>MinimumValue</key>  
  73.             <integer>1</integer>  
  74.             <key>Type</key>  
  75.             <string>PSSliderSpecifier</string>  
  76.             <key>Title</key>  
  77.             <string>等級</string>  
  78.             <key>Key</key>  
  79.             <string>levelState</string>  
  80.         </dict>  
  81.     </array>  
  82.     <key>StringsTable</key>  
  83.     <string>Root</string>  
  84. </dict>  
  85. </plist>  

 

這時候運行,在來到設置項看:

已經是我們自己設置的效果了。

4、在程式中獲取Settings 和寫入Settings 添加UI

這裡的項目是設置好了,那怎麼讀取呢?我們先在程式里添加一些對應的UI.打開.xib文件,往裡放置控制項,並生成對應的映射和Action。

 

pickerView的使用請參考iOS學習之UIPickerView控制項的簡單使用這篇文章。

5、實現讀取設置和保存代碼

關鍵是通過: NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];

代碼獲取設置項的NSUserDefaults值,然後通過key獲取設置的內容和保存設置內容

在兩個Button的按下事件實現如下:

 

[cpp] view plain copy  
  1. - (IBAction)getSettings:(id)sender {  
  2.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  3.     username.text =  [defaults objectForKey:@"username"];  
  4.     selectedAihao = [defaults objectForKey:@"aihao"];  
  5.     NSLog(@"aihao:%@",selectedAihao);  
  6.     NSInteger aihaoIndex = [aihaoValues indexOfObject:selectedAihao];  
  7.     [pickerView selectRow:aihaoIndex inComponent:0 animated:YES];  
  8.     [level setValue:[defaults integerForKey:@"levelState"]];  
  9. }  
  10.   
  11. - (IBAction)setSettings:(id)sender {  
  12.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  13.     [defaults setValue:username.text forKey:@"username"];  
  14.     NSInteger aihaoIndex = [aihaoTitles indexOfObject:selectedAihao];  
  15.   
  16.     [defaults setValue:[aihaoValues  objectAtIndex:aihaoIndex] forKey:@"aihao"];  
  17.     [defaults setInteger:level.value forKey:@"levelState"];  
  18.     UIAlertView *alert = [[UIAlertView alloc]   
  19.                           initWithTitle:@"偏好設置"  
  20.                           message:@"偏好設置已經保存!"  
  21.                           delegate:nil   
  22.                           cancelButtonTitle: @"完成"   
  23.                           otherButtonTitles:nil];  
  24.     [alert show];   
  25. }  


頭文件實現:

 

 

[cpp] view plain copy  
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface ViewController : UIViewController<UIPickerViewDelegate, UIPickerViewDataSource>  
  4. {  
  5.     NSMutableArray *aihaoTitles;  
  6.     NSMutableArray *aihaoValues;  
  7.     NSString *selectedAihao;  
  8. }  
  9.   
  10. @property (strong, nonatomic) IBOutlet UITextField *username;  
  11. @property (strong, nonatomic) IBOutlet UIPickerView *pickerView;  
  12. @property (strong, nonatomic) IBOutlet UISlider *level;  
  13. - (IBAction)getSettings:(id)sender;  
  14. - (IBAction)setSettings:(id)sender;  
  15. - (IBAction)doneEdit:(id)sender;  
  16.   
  17.   
  18. @end  


.m文件中其他代碼:

 

 

[cpp] view plain copy  
  1. #import "ViewController.h"  
  2.   
  3. @interface ViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation ViewController  
  8. @synthesize username;  
  9. @synthesize pickerView;  
  10. @synthesize level;  
  11.   
  12. - (void)viewDidLoad  
  13. {  
  14.     [super viewDidLoad];  
  15.     aihaoTitles = [[NSMutableArray alloc] init];  
  16.     [aihaoTitles addObject:@"足球"];  
  17.     [aihaoTitles addObject:@"籃球"];  
  18.     [aihaoTitles addObject:@"乒乓球"];  
  19.     aihaoValues = [[NSMutableArray alloc] init];  
  20.     [aihaoValues addObject:@"football"];  
  21.     [aihaoValues addObject:@"basketball"];  
  22.     [aihaoValues addObject:@"pingpong"];  
  23.     // Do any additional setup after loading the view, typically from a nib.  
  24. }  
  25.   
  26. - (void)viewDidUnload  
  27. {  
  28.     [self setUsername:nil];  
  29.     [self setPickerView:nil];  
  30.     [self setLevel:nil];  
  31.     [super viewDidUnload];  
  32.     // Release any retained subviews of the main view.  
  33. }  
  34.   
  35. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  36. {  
  37.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  38. }  
  39.   
  40. -(NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView  
  41. {  
  42.     return 1;  
  43. }  
  44.   
  45. -(NSInteger) pickerView:(UIPickerView *)pickerView   
  46. numberOfRowsInComponent:(NSInteger)component  
  47. {  
  48.     return [aihaoTitles count];  
  49. }  
  50.   
  51. -(NSString *) pickerView:(UIPickerView *)pickerView   
  52.              titleForRow:(NSInteger)row   
  53.             forComponent:(NSInteger)component  
  54. {  
  55.     return [aihaoTitles objectAtIndex:row];  
  56. }  
  57.   
  58. -(void) pickerView:(UIPickerView *)pickerView   
  59.       didSelectRow:(NSInteger)row   
  60.        inComponent:(NSInteger)component  
  61. {  
  62.     selectedAihao = [aihaoTitles objectAtIndex:row];  
  63. }  
  64. - (IBAction)doneEdit:(id)sender{  
  65.       
  66. }  


運行,輸入姓名zhongguo 和愛好 足球,選擇等級,保存設置。打開設置查看,可以讀取到保存後的設置。

 

這樣就可以操作和這隻程式的設置項了。

 

例子代碼:http://download.csdn.net/detail/totogo2010/4398462

 

參考資料:http://blog.csdn.net/totogo2010/

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL主從複製複製預設是非同步的,非同步複製可以提供最佳的性能, 主庫把binlog日誌發送給從庫,然後將結果返回給客戶端,並不會驗證從庫是否接收完畢。這也就意味著有可能出現當主庫或從庫發生故障的時候,從庫沒有接收到主庫發送過來的binlog日誌,導致主庫和從庫的數據不一致,甚至在恢復時造成數據的丟... ...
  • 一、概述 分片是一種在多台機器上分配數據的方法。MongoDB使用分片來支持具有非常大的數據集和高吞吐量操作。有兩種解決系統增長的方法:垂直擴展和水平擴展。 垂直擴展涉及增加單個伺服器的容量,例如使用更強大的CPU,增加更多RAM或增加存儲空間量等。介於硬體成本和硬體性能單機器能支持的併發訪問和存儲 ...
  • 1.以前在本地設置sql庫密碼,就是在本地新建資料庫的時候就輸入,怎麼也鏈接不上,原來是新建資料庫的時候不能輸入密碼,需要在內部修改。 2. 打開mysql user表 3. 打開mysql user表,一看結構就明白了 4.用mysql 語句修改 use mysql; update user se ...
  • 程式連接orarle報ORA-12505錯誤 一、異常{ ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the ...
  • 目前本人在看《SQL Server性能調優實戰》 ,以下內容是本人看本書的筆記 資料庫性能取決於各方面綜合因素: 硬體,操作系統,軟體 硬體:記憶體,CPU,磁碟 當伺服器的物理記憶體不足時,會產生大量的磁碟I/O,給磁碟帶來壓力; 當記憶體不足時,一些占用CPU資源較多的對象可能就無法被正常緩存在記憶體中 ...
  • 影響性能的幾個方面 伺服器 硬體 軟體 資料庫 資料庫存儲引擎的選擇(插件式存儲引擎) 資料庫參數配置(影響遠遠大於前面幾個影響) 資料庫結構設計和SQL語句 硬體 軟體 資料庫存儲引擎的選擇(插件式存儲引擎) 資料庫參數配置(影響遠遠大於前面幾個影響) 資料庫結構設計和SQL語句 一、伺服器 服務 ...
  • 1.命令行進入安裝mysql的bin目錄下;2.執行mysqld --skip-grant-tables命令跳過登錄驗證;3.執行msyql命令無需密碼登錄;4.執行show databases;命令查詢所有資料庫;5.使用名稱為“mysql”的資料庫(use mysql;);6.執行show ta ...
  • CREATE FUNCTION getweekdayCount ( @month varchar(10)) RETURNS INT AS BEGIN--declare @month varchar(10)--set @month='201802' 通過月份得到本月有幾天周末DECLARE @DAYC ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...