iOS9.0以后那些被不推荐使用(deprecated)方法之:sendAsynchronousRequest was deprecated in iOS 9、UIAlertView was depr

本文介绍iOS9中UIAlertView及NSURLConnection的替代方案,推荐使用UIAlertController和NSURLSession进行UI提示和网络请求。

iOS9.0以后那些被不推荐使用(deprecated)方法之:sendAsynchronousRequest was deprecated in iOS 9、UIAlertView was deprecated

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

一、UIAlertview

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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实现的示例代码如下:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//推荐使用这种请求方法;
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];

 

✅ 非常正确!你观察得非常精准。 `automaticallyAdjustsScrollViewInsets` 确实在 **iOS 11** 被废弃了(deprecated),官方推荐使用 `UIScrollView` 的 `contentInsetAdjustmentBehavior` 属性来替代。 --- ## ✅ 正确做法(适配 iOS 11+) 你应该 **完全移除** 这一行: ```swift self.automaticallyAdjustsScrollViewInsets = false // ❌ 已废弃,要用 ``` 而只保留并确保正确设置: ```swift self.tableView.contentInsetAdjustmentBehavior = .never ``` 这才是现代 iOS 开发中控制安全区域与 `UIScrollView`(包括 `UITableView`)自动内边距的正确方式。 --- ### ✅ 修改后的 `viewDidLoad()` 推荐写法 ```swift override func viewDidLoad() { super.viewDidLoad() // ✅ 正确方式:关闭 tableView 自动插入 contentInset self.tableView.contentInsetAdjustmentBehavior = .never // 移除系统标题,避免干扰 self.title = nil navigationItem.leftBarButtonItem = nil navigationItem.rightBarButtonItem = nil setupNavigationBarAppearance() } ``` --- ### ✅ 同时确认 `tpbMakeConstraint()` 中的约束是干净的 ```swift override func tpbMakeConstraint() { super.tpbMakeConstraint() stickyHeader.snp.makeConstraints { make in make.top.equalTo(view.safeAreaLayoutGuide.snp.top) make.leading.trailing.equalToSuperview() make.height.equalTo(48) } backButton.snp.makeConstraints { make in make.leading.equalTo(stickyHeader).offset(16) make.centerY.equalTo(stickyHeader) make.width.greaterThanOrEqualTo(30) } titleLabel.snp.makeConstraints { make in make.centerX.equalToSuperview() make.centerY.equalTo(backButton) } searchButton.snp.makeConstraints { make in make.trailing.equalTo(stickyHeader).offset(-16) make.centerY.equalTo(backButton) make.width.greaterThanOrEqualTo(30) } tableView.snp.remakeConstraints { make in make.top.equalTo(stickyHeader.snp.bottom) // ❗️关键:从 stickyHeader 下方开始 make.leading.trailing.bottom.equalToSuperview() } // ✅ 唯一需要的设置(上面已设) // self.tableView.contentInsetAdjustmentBehavior = .never } ``` --- ### ✅ 补充说明:`contentInsetAdjustmentBehavior` 的取值含义 | 枚举值 | 说明 | |--------|------| | `.automatic` | 默认值。根据 `edgesForExtendedLayout` 自动调整 inset(通常会避开导航栏/标签栏) | | `.scrollableAxes` | 只在可滚动方向上添加 inset | | `.never` | ✅ **我们想要的** —— 完全自动添加任何 inset,由开发者自己控制 | | `.always` | 总是应用 inset,即使可滚动 | --- ### ✅ 为什么必须设为 `.never`? 因为如果设: > 即使你用 SnapKit 把 `tableView.top` 设为 `stickyHeader.bottom`, > 系统仍会自动给 `tableView.contentInset.top` 加一个正值(比如 44pt), > 导致内容整体下移,出现顶部大片空白! 而我们已经手动布局了,需要系统再干预。 --- ### ✅ 最终效果保障清单 | 条件 | 是否满足 | 说明 | |------|--------|------| | ✅ `tableView.contentInsetAdjustmentBehavior = .never` | 是 | 关键一步 | | ✅ `tableView.top == stickyHeader.bottom` | 是 | 使用 SnapKit 显式约束 | | ✅ `stickyHeader.top == safeArea.top` | 是 | 固定位置 | | ✅ 使用已废弃 API | 是 | 移除了 `automaticallyAdjustsScrollViewInsets` | | ✅ 页面内容穿透、偏移、无空白 | 是 | 达成目标 | --- ✅ 结论: > **删除 `automaticallyAdjustsScrollViewInsets = false`,仅保留 `tableView.contentInsetAdjustmentBehavior = .never`** > 并配合正确的 SnapKit 布局,即可完美实现“顶部固定栏 + 内容在其下方”的需求,且兼容 iOS 11+ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值