一.通过Delegate来传递数据
本节主要来讲解如何使用委托delegate在不同窗口之间传递数据,具体内容来看下面的详细内容。
比如: 在窗口1中打开窗口2,然后在窗口2中填入一个数字,这个数字又回传给窗口1。
窗口1
窗口2
窗口2的结果传递给窗口1
1、首先定义个一委托UIViewPassValueDelegate用来传递值
@PRotocolUIViewPassValueDelegate- (void)passValue:(NSString *)value;@end
这个protocol 就是用来传递值
2、在窗口1的头文件里,声明delegate
#import<UIKit/UIKit.h>#import"UIViewPassValueDelegate.h"@interfaceDelegateSampleViewController : UIViewController <UIViewPassValueDelegate>{
UITextField*_value;
}
@property(nonatomic, retain) IBOutlet UITextField*value;- (IBAction)buttonClick:(id)sender;@end
并实现这个委托
- (void)passValue:(NSString *)value
{
self.value.text=value;
NSLog(@"the get value is %@", value);
}
button的Click方法,打开窗口2,并将窗口2的delegate实现方法指向窗口1。
- (IBAction)buttonClick:(id)sender
{
ValueInputView*valueView = [[ValueInputView alloc] initWithNibName:@"ValueInputView"bundle:[NSBundle mainBundle]];
valueView.delegate=self;
[self setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
[self presentModalViewController:valueView animated:YES];
}
第二个窗口的实现
.h 头文件
#import<UIKit/UIKit.h>#import"UIViewPassValueDelegate.h"@interfaceValueInputView : UIViewController {
NSObject<UIViewPassValueDelegate> *delegate;
UITextField*_value;
}
@property(nonatomic, retain)IBOutlet UITextField*value;
@property(nonatomic, retain) NSObject<UIViewPassValueDelegate> *delegate;- (IBAction)buttonClick:(id)sender;@end
.m实现文件
#import"ValueInputView.h"@implementationValueInputView@synthesizedelegate;@synthesizevalue =_value;- (void)dealloc {
[self.value release];
[super dealloc];
}- (IBAction)buttonClick:(id)sender
{
[delegatepassValue:self.value.text];
NSLog(@"self.value.text is%@", self.value.text);
[self dismissModalViewControllerAnimated:YES];
}- (void)didReceiveMemoryWarning {//Releases the view if it doesn't have a superview.[super didReceiveMemoryWarning];//Release any cached data, images, etc. that aren't in use.}- (void)viewDidUnload {
[super viewDidUnload];//Release any retained subviews of the main view.//e.g. self.myOutlet = nil;}@end
二.利用单例实现不同界面间的数据传输
首先写一个单例类,继承NSObject
check.h文件中
@property(strong ,nonatomic) UITable *Table;
@property(strong ,nonitomic) UITextFiled*Text;+(check*)shareDataModle;
check.m中
//定义一个静态的checke类的对象,并赋给一个空值
staticcheck * dataModle =nil;+(check*)shareDataModle
{if(dataModle ==nil)
{
dataModle=[[check alloc]init];
}
}
//在数据源将数据赋值给单例的对象
-(void)checkDataSource
{
[check shareDatamodle].Lable=@"15";
[check shareDatamodle].Text=@"22";
}
//引入单例的头文件 ,在对应定的方法中给对应的对象赋值
//将单例中的属性值传给当前界面中的接收对象,到此就完成了数据的传送和接收
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.numberLable.text=[check shareDataModle].Lable;
self.danHao.text=[check shareDataModle].Text;
}
三.iOS开发中使用[[UIapplicationsharedApplication] openURL:] 加载其它应用
在iOS开发中,经常需要调用其它App,如拨打电话、发送邮件等。UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的url参数的模式来调用不同的App。
通过openURL方法可以调用如下应用:
调用浏览器(Safari Browser)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http:google.com"]];
调用谷歌地图(Google Maps)
NSString *addressText =@"7 Hanover Square, New York, NY 10004";
addressText=[addressText stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];
NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
调用邮件客户端(Apple Mail)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"]];
拨号(Phone Number)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://6463777303"]];
调用短信(SMS)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://466453"]];
调用应用商店(AppStore)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=291586600&amp;mt=8"]];
四.使用NSUerDefaults或文件持久化数据后实现页面间数据的传递
IOS下可以使用NSUserDefaults、sqlite、CoreData几种常用的方式来存储数据,其中NSUserDefaults用来存储类似用户的配置等这些的数据,后两者用户存储大批量和比较复杂的数据。NSUserDefault的使用比较简单:
NSUserDefaults *mySettingData = [NSUserDefaults standardUserDefaults];
创建NSUserDefaults对象之后即可往里面添加数据,它支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放自定义的对象(如自定义的类对象),则必须将其转换成NSData存储:
NSArray *arr = [[NSArray alloc] initWithObjects:@"arr1",@"arr2", nil]
[mySettingData setObject:arr forKey:@"arrItem"];
[mySettingData setObject:@"admin"forKey:@"user_name"];
[mySettingData setBOOL:@YES forKey:@"auto_login"];
[mySettingData setInteger:1forKey:@"count"];
往NSUserDefaults添加数据后,它们就变成了全局的变量,App中即可读写NSUserDefault中的数据:NSUserDefaults *mySettingDataR =[NSUserDefaults standardUserDefaults];
NSLog(@"arrItem=%@", [mySettingDataR objectForKey:@"arrItem"]);
NSLog(@"user_name=%@", [mySettingDataR objectForKey:@"user_name"]);
NSLog(@"count=%d", [mySettingDataR integerForKey:@"count"]);
如果想删除某个数据项,可以使用removeObjectForKey删除数据:
[mySettingData removeObjectForKey:@"arrItem"];
需要注意的是,NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:[mySettingData synchronize];
运行上面的语句后,NSUserDefaults中的数据即被写入到.plist文件中,如果是在模拟器上运行程序,可以在Mac的/Users/YOUR-USERNAME/Library/Application Support/iphone Simulator/4.1/Applications/YOUR-APP-DIR/Library/Prefereces目录下面找到一个文件名为YOUR-Bundle_Identifier.plist的plist文件,用Xcode打开该文件,可以看到刚才写入的数据。