iOS 中不推荐使用的常量

Posted

技术标签:

【中文标题】iOS 中不推荐使用的常量【英文标题】:Deprecated constant in iOS 【发布时间】:2010-07-02 01:41:54 【问题描述】:

我构建了一个针对 ios 3.1.3 及更高版本的应用程序,但遇到了UIKeyboardBoundsUserInfoKey 的问题。事实证明它在 iOS 3.2 及更高版本中已被弃用。我所做的是使用以下代码根据 iOS 版本使用正确的键:

if ([[[UIDevice currentDevice] systemVersion] compare:@"3.2" options:NSNumericSearch] != NSOrderedAscending)
    [[aNotification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];
else [[aNotification.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &keyboardBounds];

这实际上工作正常,但 Xcode 警告我 UIKeyboardBoundsUserInfoKey 已弃用。我怎样才能摆脱这个警告而不必抑制任何其他警告?

另外,有没有办法简单地检查 UIKeyboardBoundsUserInfoKey 是否已定义以避免检查 iOS 版本?我尝试检查它是 NULL 还是 nil,甚至弱链接 UIKit,但似乎没有任何效果。

提前致谢

【问题讨论】:

【参考方案1】:

由于代码中任何地方存在已弃用的常量都会引发警告(并为我们 -Werror 用户中断构建),因此您可以使用实际的常量值来查找字典。感谢 Apple 通常(总是?)使用常量名称作为它的值。

至于运行时检查,我认为你更好testing for the new constant:

&UIKeyboardFrameEndUserInfoKey!=nil

所以,这就是我实际获取键盘框架的方法(基于此other answer):

-(void)didShowKeyboard:(NSNotification *)notification 
    CGRect keyboardFrame = CGRectZero;

    if (&UIKeyboardFrameEndUserInfoKey!=nil) 
        // Constant exists, we're >=3.2
        [[notification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];
        if (UIInterfaceOrientationIsPortrait([[UIDevice currentDevice] orientation])) 
            _keyboardHeight = keyboardFrame.size.height;
        
        else 
            _keyboardHeight = keyboardFrame.size.width;
           
     else 
        // Constant has no value. We're <3.2
        [[notification.userInfo valueForKey:@"UIKeyboardBoundsUserInfoKey"] getValue: &keyboardFrame];
        _keyboardHeight = keyboardFrame.size.height;
    

我实际上在 3.0 设备和 4.0 模拟器上对此进行了测试。

【讨论】:

谢谢!这正是我想要的。 如果其他人遇到此代码,请注意它不是您要查找的内容。返回的keyboardFrame 没有考虑界面方向,并且 if (UIInterfaceOrientationIsPortrait) 行会在各种情况下(特别是当设备平放在桌子上而不是直立时)给你错误的答案。相反,您要做的是使用 [self.view convertRect:keyboardFrame fromView:nil] 将未转换的窗口坐标转换为视图坐标。这将旋转框架,以便始终使用正确的高度。【参考方案2】:

UIKeyboardBoundsUserInfoKey is deprecated, what to use instead?

【讨论】:

我知道用什么代替 UIKeyboardBoundsUserInfoKey,我要问的是如何在不收到 Xcode 警告的情况下保持与 3.1.3 的兼容性。

以上是关于iOS 中不推荐使用的常量的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 8 中不推荐使用 didRotateFromInterfaceOrientation

iOS 7 中不推荐使用音量 [重复]

在 iOS9 中不推荐使用 setKeepAliveTimeout

在 iOS 中不推荐使用 Flutter 依赖项

iOS 7 及更高版本 (8.4) 中不推荐使用 SegmentedControlStyle | Xcode 6.4

Visual Studio 中不推荐使用负载测试?