首页 > 学院 > 开发设计 > 正文

IOS页面间得传值方式

2019-11-14 20:25:29
字体:
来源:转载
供稿:网友
一.通过Delegate来传递数据

本节主要来讲解如何使用委托delegate在不同窗口之间传递数据,具体内容来看下面的详细内容。

比如: 在窗口1中打开窗口2,然后在窗口2中填入一个数字,这个数字又回传给窗口1。

窗口1

IOS开发使用委托delegate在不同窗口之间传递数据

窗口2

IOS开发使用委托delegate在不同窗口之间传递数据

窗口2的结果传递给窗口1

IOS开发使用委托delegate在不同窗口之间传递数据

1、首先定义个一委托UIViewPassValueDelegate用来传递值

@PRotocol UIViewPassValueDelegate  - (void)passValue:(NSString *)value;  @end 

这个protocol 就是用来传递值

2、在窗口1的头文件里,声明delegate

复制代码
复制代码
#import <UIKit/UIKit.h> #import "UIViewPassValueDelegate.h"  @interface DelegateSampleViewController : 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"   @interface ValueInputView : 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"  @implementation ValueInputView  @synthesize delegate;  @synthesize value = _value;  - (void)dealloc {      [self.value release];      [super dealloc];  }   - (IBAction)buttonClick:(id)sender  {      [delegate passValue: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类的对象,并赋给一个空值

  static check * 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开发中使用[[UIapplication sharedApplication] 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;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:1 forKey:@"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打开该文件,可以看到刚才写入的数据。
 
 
 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表