引言:以手机为例, 当你在用一款软件听音乐时,会发现手机自带的大小声控制键和播放软件自带大小声控制键都可对声音进行大小声控制,而且他们的动作都会保持一致。那就让我们一探究竟吧!

一:设置束(settings bundle),设置束是构建到应用程序中的一组plist文件,是他向系统设置(Setting:系统设置(Setting)图标是在设备上默认有一个图标,位于屏幕上)的应用程序发送消息 ,Setting应用程序会自动创建用户界面。在ios应用程序当中,用户默认设置是由NSUserDefault类来实现,NSUserDefault类可以看做是系统Setting与应用程序用户Setting间沟通的桥梁,NSUserDefault类也是用键值来存取数据的,其特殊的一点就是NSUserDefault是将数据持久化的保存到文件系统中,而不是保存到内存的对象实例中。
二:

1) 创建Setting:Setting.bundle展开后需加入的plist文件模版,点击http://download.csdn.net/detail/dongstone/4229357

2)创建后运行结果:

三:具体的程序分析

1)首先创建一个应用程序:

2)向主屏幕(程序一开始最先显示的视图)  拖控件:

3)向副视图(这里的作用是与系统Setting一样后台控制主屏幕)  添加控件:

四:  首先看到的是xcode模板为我们生成了两个视图控制器MainViewController和FlipsideViewController。
在这里MainViewController的作用相当与音乐播放器的前台,而FlipsideViewController与系统Setting的作用是一样的,对前台数据进行操作。当然这样举例也不是很严谨,因为有的播放器程序前台视图界里面完全可以执行例如控制声音大小的简单操作,或者弹窗控制,做了更多优化。在这里为了化繁为简,突出它的具体特性,讲解一个小程序。

1)MainViewController.h
#import "FlipsideViewController.h"@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> {UILabel *usernamelable;UILabel *passwordlable;UILabel *warplable;UILabel *warpfactorlable;
}- (IBAction)showInfo:(id)sender;
@property (nonatomic, strong) IBOutlet UILabel *usernamelable;
@property (nonatomic, strong) IBOutlet UILabel *passwordlable;
@property (nonatomic, strong) IBOutlet UILabel *warpDrivelable;
@property (nonatomic, strong) IBOutlet UILabel *warpfactorlable;
//自定义方法用于刷新数据
- (void)refreshFields;
//自定义方法用于后台返回响应
-(void)backupdata;
@end

MainViewController.m

#import "MainViewController.h"@implementation MainViewController
@synthesize usernamelable;
@synthesize passwordlable;
@synthesize warpDrivelable;
@synthesize warpfactorlable;- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];// Release any cached data, images, etc that aren't in use.
}
#pragma mark obtain source from plist
//刷新方法:
-(void)refreshFields{//与系统设置(Setting.bundle)相连,可相互传递数据NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];//从沙盒里取值,这里的key是plist文件里定义好的usernamelable.text=[defaults objectForKey:@"name"];passwordlable.text=[defaults objectForKey:@"password"];warpDrivelable.text=[defaults boolForKey:@"wrap"]?@"Enable":@"Disable";warpfactorlable.text=[[defaults objectForKey:@"slider"] stringValue] ;NSLog(@"%@",[[defaults objectForKey:@"slider"] stringValue]);
}#pragma mark - View lifecycle
//视图每次切换呈现时都会调用这个方法,这里需要注意的就是当按下iphone的home键时程序进入后台,程序再走到前台时并不会调用这个方法。
-(void)viewDidAppear:(BOOL)animated{//刷新[self refreshFields];[super viewDidAppear:animated];
}- (void)viewDidLoad
{//得到应用程序的单例对象UIApplication *app=[UIApplication sharedApplication];//将当前类作为观察着,来接收应用程序的通知(从后台走到前台)来响应backupdata方法[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backupdata) name:UIApplicationWillEnterForegroundNotification object:app];[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.
}-(void)backupdata{NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];//同步系统,当从手机自带系统设置更改,程序从后台回到前台时将系统(磁盘)的setting数据同步到应用程序的Setting。[defaults synchronize];[self refreshFields];
}- (void)viewDidUnload
{[self setUsernamelable:nil];[self setPasswordlable:nil];[self setWarpDrivelable:nil];[self setWarpfactorlable:nil];[super viewDidUnload];// Release any retained subviews of the main view.// e.g. self.myOutlet = nil;
}- (void)viewWillAppear:(BOOL)animated
{[super viewWillAppear:animated];
}- (void)viewWillDisappear:(BOOL)animated
{[super viewWillDisappear:animated];
}- (void)viewDidDisappear:(BOOL)animated
{[super viewDidDisappear:animated];
}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{// Return YES for supported orientationsreturn (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}#pragma mark - Flipside View- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{[self dismissModalViewControllerAnimated:YES];
}- (IBAction)showInfo:(id)sender
{    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil];controller.delegate = self;//设置view的过渡模式controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;//呈现模式(效果就是切换视图)。[self presentModalViewController:controller animated:YES];
}@end
2)FlipsideViewController.h
#import <UIKit/UIKit.h>@class FlipsideViewController;@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end@interface FlipsideViewController : UIViewController {UISwitch *_MySwitch;UISlider *_MySilder;
}@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;
@property (nonatomic, strong) IBOutlet UISwitch *MySwitch;
@property (nonatomic, strong) IBOutlet UISlider *MySilder;- (IBAction)done:(id)sender;
//自定义方法视图从后台返回时将被调用。
-(void)applicationWillEnterForeground;//用于改变系统数据
- (IBAction)myswitchchange:(id)sender;
- (IBAction)mysliderchange:(id)sender;//刷新数据
-(void)refreshField;
@end

FlipsideViewController.m

#import "FlipsideViewController.h"@implementation FlipsideViewController@synthesize delegate = _delegate;
@synthesize MySwitch = _MySwitch;
@synthesize MySilder = _MySilder;- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];// Release any cached data, images, etc that aren't in use.
}#pragma mark - View lifecycle- (void)viewDidLoad
{//得到应用程序对象用于做通知的过滤条件UIApplication *app=[UIApplication sharedApplication];//添加观察者为self,接收应用程序的通知,响应方法为applicationWillEnterForeground。(也就是程序从后台进入前台)[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground) name:UIApplicationWillEnterForegroundNotification object:app];//刷新数据[self refreshField];[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.
}- (void)viewDidUnload
{[self setMySwitch:nil];[self setMySilder:nil];[super viewDidUnload];// Release any retained subviews of the main view.// e.g. self.myOutlet = nil;
}- (void)viewWillAppear:(BOOL)animated
{[super viewWillAppear:animated];
}- (void)viewDidAppear:(BOOL)animated
{[super viewDidAppear:animated];
}- (void)viewWillDisappear:(BOOL)animated
{[super viewWillDisappear:animated];
}- (void)viewDidDisappear:(BOOL)animated
{[super viewDidDisappear:animated];
}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{// Return YES for supported orientationsreturn (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
-(void)applicationWillEnterForeground{NSUserDefaults *defau=[[NSUserDefaults alloc]init];//同步系统,刷新系统(磁盘)的Setting[defau synchronize];[self refreshField];
}- (IBAction)myswitchchange:(id)sender {NSUserDefaults *defau=[[NSUserDefaults alloc] init];[defau setBool:self.MySwitch.on forKey:@"wrap"];//同步系统,刷新系统(磁盘)的setting[defau synchronize];
}- (IBAction)mysliderchange:(id)sender {NSUserDefaults *defau=[[NSUserDefaults alloc] init];[defau setFloat:self.MySilder.value forKey:@"slider"];//同步系统,刷新系统(磁盘)的setting[defau synchronize];
}-(void)refreshField{NSUserDefaults *defua=[[NSUserDefaults alloc] init];//同步系统,刷新系统(磁盘)的setting[defua synchronize];self.MySwitch.on=[defua boolForKey:@"wrap"];self.MySilder.value=[defua floatForKey:@"slider"];
}
#pragma mark - Actions- (IBAction)done:(id)sender
{[self.delegate flipsideViewControllerDidFinish:self];
}@end

3)小结:这个小程序里也包含了很多别的知识如:系统自动生成的部分,页面间的反转切换方法的调用,信息传递等。以前写过,有详细讲解(点击参见:(7)---02 iphone 开发 数据传递 : 页面切换与数据的反向传递以及协议(protocol)作用的体现)。

程序结果:

(9) iphone 开发 AppSettings , 系统setting与应用程序setting间的数据控制相关推荐

  1. 软件开发、系统定制、小程序等怎么报价?

    软件开发.系统定制.小程序等怎么报价? 我写这篇文章主要不是为了打什么广告,现在都2020年了,马上2021年,不管是哪个城市, 软件外包公司数不胜数,但是至今没有一家公司能把软件开发当做像一个一个产 ...

  2. 11 岁编程,21 岁开发 Linux 系统,这就是顶尖程序员的样子!

    Linux 操作系统对做开发的人来说,已经再熟悉不过了.它具备免费.可靠.安全.稳定.多平台等优势,早在 1991 年公布以来,就得到迅猛的发展.以至于现在我们用到的几乎所有的智能设备都有它的应用.比 ...

  3. Java开发陪玩系统源码小程序app详细介绍

    Java开发的陪玩系统源码小程序app以下是它的功能介绍: 一.用户端: 1. 用户注册与登录:用户可以使用手机号或微信登录进行注册. 2. 服务列表:用户可以浏览选择陪玩师提供的服务类型和价格,包括 ...

  4. saas应用与传统应用开发_如何从SaaS应用程序查询和提取数据

    saas应用与传统应用开发 每个SaaS应用程序的背后都是存储有关员工,供应商,客户和其他合作伙伴的业务信息的数据库. SaaS应用程序支持工作流,例如用于销售和市场营销的CRM,用于财务的云ERP, ...

  5. iPhone开发 获取系统时间 星期 年 月 日 时 分 秒

    //获取系统当前时间 - (NSString*)get_system_today_time { NSDate *date = [NSDate date]; NSDateFormatter *forma ...

  6. iPhone开发入门(1)—-程序员眼中的iPhone

    http://blog.csdn.net/itudou_2010/article/details/5492272 iPhone开发入门(1)--程序员眼中的iPhone 博主:易飞扬 原文链接 : h ...

  7. VMWare虚拟OSX系统搭建ios、iphone开发环境并成功运行模拟器(2016)

    虚拟OSX系统搭建ios.iphone开发环境并成功运行模拟器 搭建ios.iphone开发环境,如果你是土豪,又或者是 愿意砸钱投资.直接买个MacBook就可以了.然后从AppStore下载所需的 ...

  8. ipad iphone开发_如何在iPhone或iPad上更改应用程序的语言

    ipad iphone开发 BigTunaOnline/Shutterstock.comBigTunaOnline / Shutterstock.com Apple's iOS 13 makes th ...

  9. iPhone开发中的技巧整理(四)

    iphone开发笔记 退回输入键盘 - (BOOL) textFieldShouldReturn:(id)textField{ [textField  resignFirstResponder]; } ...

最新文章

  1. 【附超时原因】1055 The World‘s Richest (25 分)_42行代码AC
  2. Web UI回归测试 -- BackstopJS 入门
  3. 《计算机应用》实践考核,《管理系统中计算机应用》实践性环节考核方案
  4. SQL Serever学习4
  5. python安装idle_Python从零单排之Python环境及IDLE安装
  6. Git(6)-- 记录每次更新到仓库图文版(git clone、status、add、diff、commit、rm、mv命令详解)
  7. 不创建临时变量,交换两整数的值
  8. 《Redis视频教程》(p9)
  9. 好消息!Android 模拟器可以运行 ARM 应用了
  10. 社区问答系统(CQA)简单概述
  11. 15_Elasticsearch 内部原理详细解析(下篇)
  12. mp3怎么转换成m4r(iPhone铃声制作)
  13. 印度软件与信息服务业发展经验及启示
  14. 奋战7个月拿下offer【结果被裁,我哭了】
  15. 清理yarn、npm缓存包
  16. Exception locking surface SurfaceView报错解决
  17. SAP供应商 供货方和开票方不一致的强控
  18. 浅谈 Adaboost 算法
  19. AVS-CABAC算法原理简介2
  20. matlab实现无人机自组网,无人机自组网多径路由协议研究

热门文章

  1. 匹配包含换行符(回车)的任意字符串的正则表达式
  2. uniapp 动态切换应用图标、名称插件(如新年、国庆等) Ba-ChangeIcon
  3. 跟着瑜伽老师一节课程序员锻炼身体
  4. 1.8w 字 | 初中级前端 JavaScript 自测清单 - 2
  5. 湖南大学计算机软件开发毕业论文,湖南大学研究生学位论文_学位论文各页均加页眉,在版心上边线隔一行1 5磅的加粗、细双线(粗线在上),其上居_东城文库...
  6. JAVA常用jar包简介
  7. 斐波那契数列、小青蛙跳台阶
  8. Web结构挖掘算法概述及应用
  9. ELK-elasticsearch故障排查篇
  10. ChatGPT4 的体验 一站式 AI工具箱 -—Poe(使用教程)