(转)iOS9.0以后那些被不推荐使用(deprecated)方法之:sendAsynchronousRequest 和 UIAlertView

一、UIAlertview

  在Xcode7 ,iOS9.0的SDK中,已经明确提示不再推荐使用UIAlertView,而只能使用UIAlertController;

  点击一个按钮,然后弹出提示框的示例代码如下:

#import "ViewController.h" 

@interface ViewController () 

@property(strong,nonatomic) UIButton *button; 

@end 

@implementation ViewController 

- (void)viewDidLoad {
[super viewDidLoad]; 

self.button = [[UIButton alloc] initWithFrame:CGRectMake(0, 100, [[UIScreen mainScreen] bounds].size.width, 20)];
[self.button setTitle:@"跳转" forState:UIControlStateNormal];
[self.button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self.view addSubview:self.button]; 

[self.button addTarget:self action:@selector(clickMe:) forControlEvents:UIControlEventTouchUpInside]; 

} 

-(void)clickMe:(id)sender{ 

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"按钮被点击了" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil nil];
[alert show]; 

} 

@end

  但是会有警告:“‘UIAlertView’ is deprecated:first deprecated in iOS 9.0 - UIAlertView is deprecated.。。。表明UIAlertView已经iOS9中被弃用(不推荐)使用。推荐使用UIAlertController。

  为解决这个warning,使用UIAlertController来解决这个问题。代码如下:

#import "ViewController.h" 

@interface ViewController () 

@property(strong,nonatomic) UIButton *button; 

@end 

@implementation ViewController 

- (void)viewDidLoad {
[super viewDidLoad]; 

self.button = [[UIButton alloc] initWithFrame:CGRectMake(0, 100, [[UIScreen mainScreen] bounds].size.width, 20)];
[self.button setTitle:@"跳转" forState:UIControlStateNormal];
[self.button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self.view addSubview:self.button]; 

[self.button addTarget:self action:@selector(clickMe:) forControlEvents:UIControlEventTouchUpInside]; 

} 

-(void)clickMe:(id)sender{ 

//初始化提示框;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"按钮被点击了" preferredStyle: UIAlertControllerStyleAlert]; 

[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//点击按钮的响应事件;
}]]; 

//弹出提示框;
[self presentViewController:alert animated:true completion:nil]; 

} 

@end

  通过运行发下,程序运行后的效果相同。 其中preferredStyle这个参数还有另一个选择:UIAlertControllerStyleActionSheet。选择这个枚举类型后,实现效果:提示框会从底部弹出。

  -》对比:通过查看代码还可以发现,在提示框中的按钮响应不再需要delegate委托来实现了。直接使用addAction就可以在一个block中实现按钮点击,非常方便。

二、NSURLSession替换NSURLConnection

 最近使用[NSURLConnection sendAsynchronousRequest]时已经警告为不推荐使用了,苹果官方推荐使用NSURLSession中的dataTaskWithRequest方法。

 用NSURLConnection实现的示例代码如下:

  NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection
 sendAsynchronousRequest:urlRequest
 queue:queue
 completionHandler:^(NSURLResponse *response,
                     NSData *data,
                     NSError *error) {

   if ([data length] >0  &&
       error == nil){
     NSString *html = [[NSString alloc] initWithData:data
                                            encoding:NSUTF8StringEncoding];
     resault=[html copy];

     NSLog(@返回的服务器数据 = %@, html);
   }
   else if ([data length] == 0 &&
            error == nil){
     NSLog(@Nothing was downloaded.);
   }
   else if (error != nil){
     NSLog(@发生错误 = %@, error);
   }

 }];

  推荐使用NSURLSession方法实现如下:

//推荐使用这种请求方法;
NSURLSession *session = [NSURLSession sharedSession];

__block  NSString *result = @;
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

  if (!error) {
    //没有错误,返回正确;
    result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@返回正确:%@,result);

  }else{
    //出现错误;
    NSLog(@错误信息:%@,error);
  }

}];

[dataTask resume];

posted @

时间: 2024-10-08 20:20:27

(转)iOS9.0以后那些被不推荐使用(deprecated)方法之:sendAsynchronousRequest 和 UIAlertView的相关文章

iOS iOS9.0 的CoreLocation定位

一.简介 iOS9.0如果当前处于前台授权状态,默认是不可以后台获取用户位置. 如果在前台授权下,让其能获取到后台定位,该怎么办 可以设置以下属性为YES,就可以继续获取后台位置,但是会出现蓝条 使用注意:必须设置对应的后台模式,勾选后台模式:location updates @property(assign,nonatomic) BOOL allowsBackgroundLocationUpdates 注意:iOS9.0 可以单次请求用户位置 - (void)requestLocation /

UIStackView before iOS9.0

我用的Xcode8.1,同伴用的Xcode7.3.1,其上传了几个XIB文件,导致我这边项目一直爆红,爆红信息:"UIStackView before iOS9.0".如图: 网上海搜了一番,找到解决办法,现贴图如下: 将"Interface Builder Document"里的"Builds For"更改为" iOS9.0 and Later"即可.

iOS9.0适配

一.网络适配由http改成https 苹果官方对App Transport Security Technote的解释如下: 翻译成中文的意思就是说:iOS9.0SDK在编译的时候,默认所有从NSURLConnection.CFURL和NSURLSession发出的http请求,都改为https请求.由于AFNetworking版本底层是用了NSURLConnection,所以使用AFNetworking的app都将受到影响.对于这个问题的解决办法有三种,一:让服务器更新,使用https,以解析相

适配IOS9.0的那些坑!(主要说明ios9.0,64位设备,打开应用闪退的问题)

我平时的主要工作是维护公司的sdk,最近为了适配ios9.0可谓伤透了心.下面给大家分享下我这几天适配ios9.0遇到的一些问题和解决方法 希望能够帮助到大家,如果有错误的地方,还请大家能够多多指教. 首先,遇到比较多的问题,ChenYilong已经在cocoachina中讲得非常详细了,链接: http://www.cocoachina.com/ios/20150703/12392.html 非常感谢他,让我少走了很多弯路. 其次,是我遇到的两个问题,在网上没有找到相应的解释: 一.一些应用在

iOS9.0 https适配

苹果升级到iOS9.0后,貌似使用了TLS和SSL加密处理,导致一般的http发送请求获取不到数据,如何解决这个问题: 1)升级公司的服务器,采用https 2)使用代码回退使用http,目前苹果没有反对,但个人决定未来苹果可能会逐渐强制用户使用https(为了安全考虑无可厚非),但至少现在看来使用回退是比较直接的 info.plist文件中,新增一个:NSAppTransportSecurity  打开,加多一个NSAllowsArbitraryLoads 并且设置为YES就OK了:如图 或者

iOS9.0上传出现ERROR ITMS-90475

iOS9.0提交appstore审核出现类似问题:ERROR ITMS-90475: "Invalid Bundle. iPad Multitasking support requires launch story board in bundle 1)要求使用storyboard或者xib(如果使用手码的话,可以参考百度地图SDkdemo的MainWindow.xib如下) 2)设置工程general界面,去掉之前勾选的ipad Requires full screen复选框如图 或者在info

ionic3 在ios9.0 系统下 会出现ReferenceError:Can't find variable:Intl 错误提示

ionic3 框架开发app  在ios 9.0版本中 ReferenceError:Can't find variable:Intl 错误提示: 在index.html 文件中添加 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 一定要添加在 <script src="cordova.js">&

Safe Area Layout Guide before iOS9.0

报错显示写的很明白,该特性不支持iOS9.0以下的系统,那么是不是将支持版本提高呢?其实并不需要这么做,新特性已经可以让你限制支持的版本,正确的方法就是将该特性调成9.0以后的系统,正确做法如下: Ref: https://www.jianshu.com/p/f497ae0c21e7 原文地址:https://www.cnblogs.com/open-coder/p/12660479.html

9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中. 在这里,我们将它稍加推广,泛指一切生成并返回一个对象的静态函数. 一个经典的工厂方法如同这样: Sprite* factoryMethod() { Sprite* ret = new Sprite(); //在这里对 ret