iOS 8 之后,还能继续使用 UIActionSheet 和 UIAlertView 吗?

Posted

技术标签:

【中文标题】iOS 8 之后,还能继续使用 UIActionSheet 和 UIAlertView 吗?【英文标题】:After iOS 8, can I continue to use UIActionSheet and UIAlertView? 【发布时间】:2014-10-11 13:40:19 【问题描述】:

我的应用程序使用 UIActionSheetUIAlertView。 在 ios8 中,Apple 的文档和一些网站表示它们在 iOS8 中已被弃用。

UIActionSheet 文档 重要提示:UIActionSheet 在 iOS 8 中已弃用。(请注意 UIActionSheetDelegate 也已弃用。)创建和管理操作 iOS 8 及更高版本中的工作表,而是使用 UIAlertController 和 UIAlertControllerStyleActionSheet 的首选样式。

但在部署目标为 8.0 的 Xcode 6 中,使用 UIActionSheetUIAlertView 不会生成警告。 通常 Xcode 会为已弃用的 API 生成警告。 为什么 Xcode 不为 UIActionSheetUIAlertView 生成警告? 这是否意味着 Apple 实际上并没有弃用这些类? 如果他们真的弃用了它们并且 Xcode 不生成警告,这是非常危险的。 在另一个苹果的文档“iOS 8.0 中的新功能”中说:

新的UIAlertController 类取代了UIActionSheetUIAlertView类,成为在您的应用中显示警报的首选方式。

https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

并且UIActionSheetUIAlertView 未列在上述 URL 文档的已弃用的 API 部分。 因此,此文档意味着 UIAlertController 更可取,但 UIActionSheetUIAlertView 在 iOS 8 中仍然可用。

我应该用新的UIAlertController 类替换我的应用程序中的UIActionSheetUIAlertView 吗? 或者我可以继续使用UIActionSheetUIAlertView吗?

【问题讨论】:

在我的一些应用程序中,我遇到了在 iPad 中两次调用 ActionSheetDelegate 方法的问题,因此我不得不将其替换为 UIAlertController。正如所有答案所暗示的那样,保持最新状态而不使用贬损方法总是好的 github.com/skywinder/ActionSheetPicker-3.0 【参考方案1】:

最好不要使用贬值的代码,所有这些加起来就是编写良好的代码。 所以,是的,使用 UIAlertController。

【讨论】:

【参考方案2】:

是的,你应该这样做。 Preferable 导致 deprecated 导致突然被切断。

【讨论】:

谢谢! “Preferable Leads to deprecated”是个好建议。我用新的UIAlertController 替换了我的代码。就我而言,更换并不是很困难。而且我发现新的UIAlertController 比旧的UIActionSheetUIAlertView 更容易使用。 只要确保你不需要支持 iOS7,因为 UIAlertController 在那里不可用。【参考方案3】:

是的,你应该替换你的代码。

当我尝试在我的代码中使用 UIActionSheetUIAlertView 两个类的一些函数和委托方法时,它们都不起作用。

我每次都遇到问题和奇怪的结果。

因此,您不应使用已弃用的 API。

我对此很确定,我认为如果应用已被弃用的 API 上传到 App Store,那么该应用可能会被拒绝。

【讨论】:

我刚刚为新手机更新了一堆应用程序,但没有更新每个应用程序中的两个 UIActionSheet 方法。它们已被 App Store 评论者接受,现在正在出售。 YMMV【参考方案4】:

找出新方法需要一段时间,因此您可能会发现这段代码很有用。我支持旧版本的 iOS,所以我使用条件来决定使用哪个。此代码在我的应用程序委托中运行。如果您在视图控制器中运行它,请替换

[self.window.rootViewController presentViewController:alert animated:true completion:nil];

[self presentViewController:alert animated:YES completion:nil];

#define 在我的 .pch 中,但我把它放在这里,因为它是我在条件中使用的。

 #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

  - (void)applicationWillEnterForeground:(UIApplication *)application 

        if (self.window.rootViewController) 

            if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) 
                [self displayUIAlertController];
             else 
                [self displayUIAlertView];
            
        

    

    - (void)displayUIAlertController 

        NSString *alertMessage = [NSString stringWithFormat:@"Do you want to resume playing %@ or start a new session?", GAME_NAME_TITLE];
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Welcome Back"
                                                                       message:alertMessage
                                                                preferredStyle:UIAlertControllerStyleAlert];

        // You can add as many actions as you want
        UIAlertAction *startNewSession = [UIAlertAction actionWithTitle:@"Start New Session"
                                                                  style:UIAlertActionStyleDefault
                                                                handler:^(UIAlertAction *action) 
           [self startNewSession];
        ];

        UIAlertAction *doNothingAction = [UIAlertAction actionWithTitle:@"Resume"
                                                                  style:UIAlertActionStyleDefault
                                                                handler:^(UIAlertAction *action) 
                        // Do nothing
        ];

        // Add actions to the controller so they will appear
        [alert addAction:doNothingAction];
        [alert addAction:startNewSession];

        // Finally present the action
        [self.window.rootViewController presentViewController:alert animated:true completion:nil];
    

    - (void)displayUIAlertView 
        NSString *messageWithTitle = [NSString stringWithFormat:@"Do you want to resume playing %@ or start a new session?", GAME_NAME_TITLE];
        self.alertView = [[UIAlertView alloc] initWithTitle:@"Welcome Back"
                                                        message:messageWithTitle
                                                       delegate:self
                                              cancelButtonTitle:@"Resume"
                                              otherButtonTitles: @"Start New Session",nil];
        [self.alertView show];
    

    #pragma mark - Alert on restart
    // buttonIndex 0 is cancel and the game continues
    // buttonIndex 1 is Start New Session and the old results are saved and new session started
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
        if (buttonIndex == 1) 
            [self startNewSession];
        
    

【讨论】:

【参考方案5】:

不推荐使用的代码通常意味着以前的版本不受标记的版本和将来的支持。如果您正在构建旧版应用程序(或将支持先前版本的应用程序),则应使用 UIActionSheet 和 UIAlertView,但是如果您要更新 iOS8+ 的代码,则应使用 UIAlertController。好处是您之前编写的代码不会受到影响,因此用户可以毫无问题地使用该应用程序的旧版本。

【讨论】:

【参考方案6】:

应该能够继续在 iOS8 中使用 UIAlertView 和 UIActionSheet,因为它们在 iOS8 中而不是在 iOS7 中已被弃用。也就是说,我遇到了类似的问题 => UIAlertView automatic newline gone in iOS8?。所以看起来我们可能需要比我们预期的更快地迁移到 UIAlertController。

【讨论】:

以上是关于iOS 8 之后,还能继续使用 UIActionSheet 和 UIAlertView 吗?的主要内容,如果未能解决你的问题,请参考以下文章

苹果税是时候改了,它将失去一大笔利润,还能继续高傲么?

jquery选择器$("...")返回的是数组,为啥还能继续练式操作$("...").方法 ?

[JSOI2019]神经网络

react 开发

为啥我的 for 循环在“继续”之后没有重新评估条件?

习题 8-17 UVA - 11536Smallest Sub-Array