传参方法:sharedApplication, NSUserDefaults, protocol 和 delegate(实例)

iOS开发技巧
本文介绍了iOS开发中的几个实用技巧,包括如何使用UIApplication:openURL:方法调用其他应用程序,如浏览器、地图、邮件客户端等;如何利用NSUserDefaults进行数据的读取与写入;以及如何运用protocol和delegate实现值的回调。

1. iOS开发中使用[[UIApplication sharedApplication] openURL:] 加载其它应用

 

在iOS开发中,经常需要调用其它App,如拨打电话、发送邮件等。UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的url参数的模式来调用不同的App。

 

通过openURL方法可以调用如下应用:

 

调用浏览器(Safari Browser)

C代码   收藏代码
  1. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http:google.com"]];  
 

调用谷歌地图(Google Maps)

C代码   收藏代码
  1. NSString *addressText = @"7 Hanover Square, New York, NY 10004";  
  2. addressText = [addressText stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];  
  3. NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];  
  4. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];  

 

调用邮件客户端(Apple Mail)

C代码   收藏代码
  1. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"]];  
 

拨号(Phone Number)

C代码   收藏代码
  1. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://6463777303"]];  
 

调用短信(SMS)

C代码   收藏代码
  1. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://466453"]];  
 

调用应用商店(AppStore)

C代码   收藏代码
  1. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=291586600&mt=8"]];  

 

2. NSUserDefaults读取和写入自定义对象

C代码   收藏代码
  1. NSString *string = [NSString stringWithString @"data is here"];    
  2. NSUserDefaults *data = [NSUserDefaults standardUserDefaults];    
  3. [data setObject:string forKey:@"key"];    
  4. NSString *value;    
  5. value = [data objectForKey:"key"];    
 

但是并不是所有的东西都能往里放的。NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

 

3. protocol 和 delegate 回调函数传值

 

一、说明
  1.协议声明了可以被任何类实现的方法
  2.协议不是类,它是定义了一个其他对象可以实现的接口
  3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
  4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
  5:委托,就是调用自己定义方法,别的类来实现。
  6.新特性说明
    @optional预编译指令:表示可以选择实现的方法
    @required预编译指令:表示必须强制实现的方法

 

二、定义

 

.h

C代码   收藏代码
  1. @protocol ContactCtrlDelegate  
  2. - (void)DismissContactsCtrl;  
  3. - (void)CallBack:(NSString *)str; //回调传值  
  4. @end  
  5.   
  6. @interface ContactsCtrl : UIViewController {  
  7.     id <ContactCtrlDelegate> delegate;  
  8. }  
  9. @property (nonatomic, assign) id <ContactCtrlDelegate> delegate;  
 

.m

C代码   收藏代码
  1. @synthesize delegate;  

 

三、Demo

 

二级窗口(子窗口)UIViewController subclass

 

  • 1 Textfield
  • 1 Button

1、ContactsCtrl.h  

C代码   收藏代码
  1. #import <UIKit/UIKit.h>  
  2.   
  3. //定义协议  
  4. @protocol ContactCtrlDelegate  
  5.   
  6. - (void)DismissContactsCtrl;      //回调关闭窗口  
  7. - (void)CallBack:(NSString *)str; //回调传值  
  8.   
  9. @end  
  10.   
  11.   
  12. @interface ContactsCtrl : UIViewController  
  13. {  
  14.     __weak IBOutlet UITextField *passData; //textfield  
  15.     id <ContactCtrlDelegate> delegate;     //开放delegate  
  16.     NSString *passedVal;                   //从主窗口获取传值          
  17. }  
  18.   
  19. @property(nonatomic,retain)id <ContactCtrlDelegate> delegate;  
  20. @property(nonatomic,retain)NSString *passedVal;  
  21.   
  22. - (IBAction)cancelBtn:(id)sender;  
  23.   
  24. @end  
 

2、ContactsCtrl.m

C代码   收藏代码
  1. @implementation ContactsCtrl  
  2. @synthesize delegate;  
  3. @synthesize passedVal;  
  4.   
  5. - (void)viewDidLoad  
  6. {  
  7.     [super viewDidLoad];  
  8.     // Do any additional setup after loading the view from its nib.  
  9.     passData.text = passedVal;  
  10. }  
  11.   
  12. //调用协议中的方法  
  13. - (IBAction)cancelBtn:(id)sender  
  14. {  
  15.     [delegate CallBack:[NSString stringWithFormat:@"%@",passData.text]];  
  16.     [delegate DismissContactsCtrl];  
  17. }  
 

一级窗口(父窗口)

 

  • 1 Textfield
  • 1 Button

3、ViewController.h

C代码   收藏代码
  1. #import <UIKit/UIKit.h>  
  2. #import "ContactsCtrl.h"  //引入二级文件  
  3.   
  4. @interface ViewController : UIViewController <ContactCtrlDelegate>  
  5. {  
  6.     ContactsCtrl *contactsView;  //定义  
  7.     __weak IBOutlet UITextField *textfield;  
  8. }  
  9.   
  10. @property(nonatomic,retain) ContactsCtrl *contactsView;  
  11.   
  12. - (IBAction)addContactsView:(id)sender;  
  13.   
  14. @end  
 

4、ViewController.m

C代码   收藏代码
  1. #import "ViewController.h"  
  2.   
  3. @implementation ViewController  
  4. @synthesize contactsView;  
  5.   
  6. - (IBAction)addContactsView:(id)sender  
  7. {  
  8.     ContactsCtrl *contactView = [[ContactsCtrl alloc] initWithNibName:nil bundle:nil];  
  9.     self.contactsView = contactView;  
  10.     contactsView.delegate = self;  //设置委托  
  11.     contactsView.passedVal = textfield.text;  
  12.     [self presentModalViewController:contactsView animated:YES];  
  13. }  
  14.   
  15. //实现ContactCtrlDelegate协议中的方法  
  16. - (void)DismissContactsCtrl  
  17. {  
  18.     [contactsView dismissModalViewControllerAnimated:YES];  
  19. }  
  20.   
  21. - (void)CallBack:(NSString *)str  
  22. {  
  23.     textfield.text = str;  
  24. }  
### UIWindow 获取方式的区别分析 在 iOS 开发中,获取 `UIWindow` 实例通常会使用两种方法:`[[UIApplication sharedApplication] keyWindow]` `[[UIApplication sharedApplication].delegate window]`。这两种方式虽然都能获取到窗口实例,但它们的用途行为存在显著差异。 #### 1. `keyWindow` 的作用与特点 `keyWindow` 是一个系统管理的属性,表示当前接收键盘事件的窗口。这个窗口通常是用户正在交互的窗口。例如: ```objective-c UIWindow *currentKeyWindow = [[UIApplication sharedApplication] keyWindow]; ``` - **动态性**:`keyWindow` 是动态变化的,当有新的窗口(如弹窗、系统通知等)覆盖在主窗口上时,`keyWindow` 会指向这个新窗口。 - **多窗口支持**:在 iPadOS 支持分屏功能的情况下,可能会同时存在多个窗口,此时 `keyWindow` 表示当前聚焦的窗口。 - **潜在为 nil**:在某些情况下,比如应用刚启动或窗口尚未完全初始化时,`keyWindow` 可能为 `nil` [^1]。 #### 2. `delegate.window` 的作用与特点 `delegate.window` 是由开发者手动创建并赋值的窗口,通常在 `AppDelegate` 中进行初始化: ```objective-c - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // 设置 rootViewController 并调用 makeKeyAndVisible [self.window makeKeyAndVisible]; return YES; } ``` - **静态性**:`delegate.window` 是开发者显式创建的窗口,通常在整个应用程序生命周期内保持不变。 - **可靠性**:由于是开发者直接管理的窗口,因此它的值通常不会为 `nil`,除非开发者未正确初始化它。 - **与 `keyWindow` 的关系**:在正常情况下,`delegate.window` 通常就是 `keyWindow`,但在特定场景下(如显示自定义弹窗时),两者可能不一致 [^3]。 #### 3. 两者的区别总结 | 特性 | `keyWindow` | `delegate.window` | |---------------------|--------------------------------------|--------------------------------------| | 来源 | 系统自动管理 | 开发者手动创建并赋值 | | 是否动态变化 | 是 | 否 | | 是否可能为 `nil` | 是 | 否(假设已正确初始化) | | 是否始终指向主窗口 | 否 | 是 | | 多窗口环境下的表现 | 指向当前焦点窗口 | 始终指向开发者设定的主窗口 | #### 4. 使用建议 - **需要获取当前交互窗口时**:应使用 `keyWindow`,特别是在需要响应用户输入或显示弹窗时。 - **需要操作主窗口时**:应使用 `delegate.window`,尤其是当需要确保操作的是应用程序的主窗口时。 - **避免依赖 `keyWindow` 为非 `nil`**:在某些特殊场景下(如应用启动初期),`keyWindow` 可能为 `nil`,因此在使用前最好进行判空处理。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值