zoukankan      html  css  js  c++  java
  • IOS页面间得传值方式

    一.通过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打开该文件,可以看到刚才写入的数据。
     
     
     
  • 相关阅读:
    个人推荐网上商店
    vs 安装程序制作
    this linker was not configured to use sysroots和C compiler cannot create executables的解决办法
    将asihttprequest编译后的目标文件打包
    cygwin下的gcc4.7.1编译心得
    给ubuntu12.04换3.4.6的内核
    boost::asio::streambuf相关的操作方法
    应用boost库serialize标准库里的map
    cygwin下gdb7.4编译
    sql server存储过程分页,支持cte
  • 原文地址:https://www.cnblogs.com/rocky18/p/3774476.html
Copyright © 2011-2022 走看看