目标C:如何支持弃用的方法

时间:2012-09-28 11:29:50

标签: objective-c ios deprecated

因此,对于每个新操作系统,都会声明一组方法已被弃用。对我来说奇怪的是,如果我仍然支持iOS5和iOS6,我必须同时使用已弃用和替换的方法,例如UILabel的{​​{1}}超过minimumScaleFactor。< / p>

如果我将minimumFontSize替换为myLabel.minimumFontSize,那么我的应用将会在iOS5中崩溃。

因此我使用myLabel.minimumScaleFactorif来确定操作系统是5还是6,并相应地使用-respondsToSelector:minimumScaleFactor

问题是我可能不得不在我的代码中编写一堆minimumFontSizeif,这感觉很愚蠢。

有更好的方法来处理弃用吗?

5 个答案:

答案 0 :(得分:6)

我创建了可以在任何ios中使用的函数:

void AbsSdk30_upg60_UILabel_setMinimumScaleFactor(UILabel * label, CGFloat minimumScaleFactor) {
    if ([label respondsToSelector: @selector(setMinimumScaleFactor:)]) {
        [label setMinimumScaleFactor: minimumScaleFactor];
    }
    else {
        const CGFloat curFontSize = label.font.pointSize;
        const CGFloat fontSize = (0.0 == curFontSize) ? [UIFont labelFontSize] : curFontSize;
        [label setMinimumFontSize: fontSize * minimumScaleFactor];
    }
}

答案 1 :(得分:2)

独立语言解决方案:在应用程序开始时获取操作系统并设置全局变量。然后,当neede查询OS版本的变量时。您可以在case / switch语句中执行此操作,以便在将来版本发生更改时可以轻松扩展。

伪代码:

switch iOSversion
    case < 6
        dothis
        break
    case <7
        dothat
        break
    case >7
        OS not supported ;)

从技术上讲,它与IF相同,但你的来源会更短,更结构化,而且你不必每次都查询操作系统版本,而是在应用程序开始时查询。

答案 2 :(得分:1)

为此,您应该将部署目标设置为最小值。因此,如果您运行您的应用程序。那时它不会给您弃用的错误。而且您也不需要在代码中编写if s和respondsToSelectors。您可以将部署目标设置为ios 5.0或5.1 我认为这对你有用。 如果您希望部署目标6.0,那么将有另一种方法可以替换已弃用的方法。

答案 3 :(得分:1)

我将'弃用'视为一种警告,即某种方法可能会在未来的某个时刻消失,而不是现在必须更换。我没有给当前版本的代码复杂化,而是留下了关于当我放弃对某些旧版本的支持时要改变什么的评论。

除了在新版本中停止工作的内容之外,我不会#ifdef版本。

答案 4 :(得分:0)

在.h文件或.h和.m文件中向UILabel添加类别,其中.h文件将由使用它的代码导入:

@interface UILabel (UILabelCategory)

+ (CGFloat)minimumLabelFontSize;
- (void)adjustsFontSizeToFitWidthWithMinimumFontSize:(CGFloat)fontSize;

@end

@implementation UILabel (UILabelCategory)

+ (CGFloat)minimumLabelFontSize // class method that returns a default minimum font size
{
    return 11;
}

- (void)adjustsFontSizeToFitWidthWithMinimumFontSize:(CGFloat)fontSize
{
    if ([self respondsToSelector: @selector(setMinimumScaleFactor:)])
    {
        CGFloat currentFontSize = self.font.pointSize == 0 ? [UIFont labelFontSize] : self.font.pointSize;
        [self setMinimumScaleFactor:fontSize / currentFontSize];
    }
    else
    {
        [self setMinimumFontSize:fontSize]; // deprecated, only use on iOS's that don't support setMinimumScaleFactor
    }
    [self setAdjustsFontSizeToFitWidth:YES];
}

@end

然后从代码中的多个位置调用这样的UILabel扩展: (假设您有一个名为_instructions的UILabel对象,并且您导入了实现UILabelCategory扩展名的文件)

[_instructions adjustsFontSizeToFitWidthWithMinimumFontSize:[UILabel minimumLabelFontSize]];

或者像这样:

[_instructions adjustsFontSizeToFitWidthWithMinimumFontSize:14];

注意:请记住,在iOS 6和之前的setMinimumFontSize仅在您将行数设置为1时才有效:

[_instructions setNumberOfLines:1]; // on iOS6 and earlier the AdjustsFontSizeToFitWidth property is only effective if the numberOfLines is 1