iOS之应用偏好设置
為什么80%的碼農都做不了架構師?>>> ??
如今,即便是最簡單的計算機程序也會包含一個偏好設置窗口,用戶可以在其中設置應用專屬的選項。在MAC OS X中,Preferences...菜單通常位于應用菜單中。選擇該菜單項會彈出一個窗口,用戶可以在其中輸入和更改各種選項。iPhone和其他iOS設備有一個專門的“設置”應用程序來進行各種設置,你肯定用過很多次了。
設置捆綁包
通過應用設置,用戶可以輸入和更改任何帶有設置捆綁包(settings bundle)的應用中的偏好設置。設置捆綁包是應用自帶的一組文件,用于告訴設置該應用期望得到用戶的哪些偏好設置。下圖是實例效果圖:
? ? ? ?
對于iOS用戶默認設置(User Defaults)機制,設置應用充當著通用用戶界面的角色。用戶默認設置是保存和獲取偏好設置的系統的一部分。
在iOS應用中,用戶默認設置由NSUserDefaults類實現。應用通過NSUserDefaults用鍵值對的方式來讀取和保存偏好設置數據,與通過鍵從NSDictionary對象中獲取數據一樣。不同之處在于NSUserDefaults數據會被持久保存在文件系統中,而不是存儲在內存的對象實例中。
應用
接下來的部分,通過創建一個簡單的應用,來實現應用設置控制應用程序。
創建應用
在Xcode中,創建Tabbed Application工程。
使用設置捆綁包
設置應用使用每個應用中設置捆綁包的內容構建出一個應用的設置視圖。如果應用沒有設置捆綁包,則設置應用不會顯示出應用程序的任何信息。每個設置捆綁包必須包含一個名為Root.plist的屬性列表,它定義了根級偏好設置視圖。此屬性列表必須遵循一種非常嚴格的格式。
當設置應用啟動時,它會檢查每個應用程序的設置捆綁包并為包含設置捆綁包的每個應用添加設置組。
在項目中添加設置捆綁包
新建設置捆綁包,操作如下圖
在iOS-->Resource-->Settings Bundle點擊Next,名字保留默認,最后點擊Create即可。
編輯屬性列表文件
接下來需要編輯Root.plist文件,具體內容如下圖
在Item8中,引用的More.plist文件,具體內容如下圖
這里需要補充說明一點:
iOS上的應用不能從其他應用的沙盒中讀取文件。設置捆綁包并不是我們應用沙盒的一部分,而是設置應用沙盒的一部分。
設計展示界面
數據準備好之后,添加圖標資源,設計數據展示界面。效果圖如下
? ??
界面是通過代碼實現的,主要使用了如下幾個控件:
@interface?FirstViewController?()@property?(nonatomic,?strong)?UILabel?*officerLabel; @property?(nonatomic,?strong)?UILabel?*authorizationCodeLabel; @property?(nonatomic,?strong)?UILabel?*rankLabel; @property?(nonatomic,?strong)?UILabel?*warpDriveLabel; @property?(nonatomic,?strong)?UILabel?*warpFactorLabel; @property?(nonatomic,?strong)?UILabel?*favoriteTeaLabel; @property?(nonatomic,?strong)?UILabel?*favoriteCaptainLabel; @property?(nonatomic,?strong)?UILabel?*favoriteGadgetLabel; @property?(nonatomic,?strong)?UILabel?*favoriteAlienLabel;@end @interface?SecondViewController?()@property?(nonatomic,?strong)?UISwitch?*engineSwitch; @property?(nonatomic,?strong)?UISlider?*warpFactorSlider; @property?(nonatomic,?strong)?UIButton?*settingInfo;@end讀取應用中的設置
我們將使用NSUserDefaults類訪問用戶設置。NSUserDefaults作為單例類,意味著應用中只能有一個NSUserDefaults實例在運行。為了訪問這個實例,需要調用standardUserDefaults。
鍵宏定義
#ifndef?BridgeControl_Constants_h#define?BridgeControl_Constants_h#define?kOfficerKey?@"officer"#define?kAuthorizationCodeKey?@"authorizationCode"#define?kRankKey?@"rank"#define?kWarpDriveKey?@"warp"#define?kWarpFactorKey?@"warpFactor"#define?kFavoriteTeaKey?@"favoriteTea"#define?kFavoriteCaptionKey?@"favoriteCaptain"#define?kFavoriteGadgetKey?@"favoriteGadget"#define?kFavoriteAlienKey?@"favoriteAlien"#endif更新主視圖控制器
//FirstViewController.m-?(void)viewDidLoad?{[super?viewDidLoad];//?Do?any?additional?setup?after?loading?the?view,?typically?from?a?nib.[self?refreshFields]; }-(void)refreshFields{NSUserDefaults?*defaults?=?[NSUserDefaults?standardUserDefaults];self.officerLabel.text?=?[defaults?objectForKey:kOfficerKey];self.authorizationCodeLabel.text?=?[defaults?objectForKey:kAuthorizationCodeKey];self.rankLabel.text?=?[defaults?objectForKey:kRankKey];self.warpDriveLabel.text?=?[defaults?boolForKey:kWarpDriveKey]???@"engaged"?:?@"Disabled";self.warpFactorLabel.text?=?[[defaults?objectForKey:kWarpFactorKey]?stringValue];self.favoriteTeaLabel.text?=?[defaults?objectForKey:kFavoriteTeaKey];self.favoriteCaptainLabel.text?=?[defaults?objectForKey:kFavoriteCaptionKey];self.favoriteGadgetLabel.text?=?[defaults?objectForKey:kFavoriteGadgetKey];self.favoriteAlienLabel.text?=?[defaults?objectForKey:kFavoriteAlienKey]; } //SecondViewController.m-?(void)viewDidLoad?{[super?viewDidLoad];//?Do?any?additional?setup?after?loading?the?view,?typically?from?a?nib.????[self?refreshFields]; }-(void)refreshFields{NSUserDefaults?*defaults?=?[NSUserDefaults?standardUserDefaults];self.engineSwitch.on?=?[defaults?boolForKey:kWarpDriveKey];self.warpFactorSlider.value?=?[defaults?floatForKey:kWarpFactorKey]; }添加控件響應事件
為SecondViewController中的UIButton,UISwitch和UISlider控件添加監聽事件。
-?(void)engineSwitchTapped?{NSUserDefaults?*defaults?=?[NSUserDefaults?standardUserDefaults];[defaults?setBool:self.engineSwitch.on?forKey:kWarpDriveKey];[defaults?synchronize]; }-?(void)warpSliderTouched?{NSUserDefaults?*defaults?=?[NSUserDefaults?standardUserDefaults];[defaults?setFloat:self.warpFactorSlider.value?forKey:kWarpFactorKey];[defaults?synchronize]; } //切換到“設置”應用程序-(void)settingInfoClicked{[[UIApplication?sharedApplication]?openURL:[NSURL?URLWithString:UIApplicationOpenSettingsURLString]]; }注冊默認值
//AppDelegate.m-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{//?Override?point?for?customization?after?application?launch.????//程序啟動后的一些自定義設置NSDictionary?*defaults?=?@{kWarpDriveKey:@YES,kWarpFactorKey:@2,kFavoriteAlienKey:@"Vulcan"???};[[NSUserDefaults?standardUserDefaults]?registerDefaults:defaults];????return?YES; }保證設置有效
如果現在將應用運行,查看設置信息并按下主屏幕按鈕來修改一些值。然后再按Home鍵,再重新打開應用,結果發現設置并沒有生效。
原因在于:在iOS中,當應用正在運行時按Home鍵并不會退出該應用,而是由操作系統在后臺將其暫停,這樣它就能隨時快速啟動。
在這個例子中,我們需要添加一點工作,以實現應用被喚醒時,能重新加載用戶偏好設置并重新顯示它們。
通知,時對象之間進行通信的輕量級機制。任何對象都能定義一個或多個發送到應用通知中心的通知。通知中心是一個單例對象,作用在于對象之間傳送通知。
UIApplication類會發送大量的通知,大多數通知的用途從命名就能看出來,這個例子中我們就使用到了通知。
將下列代碼添加到兩個控制器的viewDidLoad方法中:
UIApplication?*app?=?[UIApplication?sharedApplication];[[NSNotificationCenter?defaultCenter]?addObserver:self?selector:@selector(applicationWillEnterForeground:)?name:UIApplicationWillEnterForegroundNotification?object:app];然后添加相應的響應方法
-(void)applicationWillEnterForeground:(NSNotification?*)notification{NSUserDefaults?*defaults?=?[NSUserDefaults?standardUserDefaults];[defaults?synchronize];[self?refreshFields]; }小結
本文主要講解了如何使用應用設置,如何使用NSUserDefaults讀取偏好設置,以及如何讓用戶在應用內修改偏好設置。
?
實例源代碼地址:https://github.com/CharsDavy/BridgeControl
?
轉載于:https://my.oschina.net/chars/blog/603451
總結
以上是生活随笔為你收集整理的iOS之应用偏好设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式(结构型模式)——装饰模式(De
- 下一篇: redis命令 举例