1

问题:每个新的 iOS 都添加了很多新的有用的类。例如,UIRefreshControl。我想在 iOS5 构建中添加对此类的支持。

不是很酷的解决方案:在所有必须使用 UIRefreshControl 的类中,我可以检查当前的 iOS 版本并使用该类的内联替换,例如:

pseudocode
...

- (void)viewDidLoad
{
    ...

    if([[UIDevice currentDevice].systemVersion floatValue] < 6.0)
    {
        self.refreshControl = [[MyCustonRefreshControl_for_iOS5 alloc] init];
    }
    else
    {
        self.refreshControl = [[UIRefreshControl alloc] init];
    }
    ...
}

这个解决方案并不酷,因为我必须在我想使用最新 iOS 功能的所有类中添加相同的代码。

可能很酷的解决方案:1)获取或创建您自己的 100% 兼容的类,例如对于 UIRefreshControl,您可以使用 CKRefreshControl(https://github.com/instructure/CKRefreshControl);2)App启动时使用Objective-C运行时定义替换类为主类。

pseudocode
...

// ios 5 compatibility
#include <objc/runtime.h>
#import "CKRefreshControl.h"
...



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...

    // pre-ios 6 compatibility
    if([[UIDevice currentDevice].systemVersion floatValue] < 6.0)
    {
        // register refresh control
        Class clazz = objc_allocateClassPair([CKRefreshControl class], "UIRefreshControl", 0);
        objc_registerClassPair(clazz);
    }

    ...
}

我认为这种方式真的很酷,但是这段代码行不通。

4

4 回答 4

0

@abuharsky,[CKRefreshControl] https://github.com/instructure/CKRefreshControl已经更新,现在完全符合您的要求。您需要做的就是:

self.refreshControl = [[UIRefreshControl alloc] init];

如果这对您不起作用,请告诉我们。

于 2013-01-28T23:02:02.267 回答
0

第二个灵魂应该可以正常工作启用ARC
时可能会出现一些问题,因此,您应该将 allocate_pair 代码移动到使用标志编译的某个类-fno-objc-arc

有关更多信息,请查看此处(在评论中): http:
//www.mikeash.com/pyblog/friday-qa-2010-11-6-creating-classes-at-runtime-in-objective-c.html

于 2012-12-05T18:27:22.973 回答
0

您可能希望使用不同的工作方式创建一个一致的界面。你需要一个 策略设计模式来解决你的问题。然后您只需要检查一次版本 - 在初始化执行 iOS 版本特定工作的对象时。

于 2012-10-26T10:34:02.560 回答
0

如果所有方法调用都是相同的(并且没有类/“静态”方法可言),只需使用“工厂”方法创建对象,然后“正常”使用它们。

否则,我可能会使用“包装器”类,根据 Filip 的帖子之一,将调用重新路由到内置支持或“替换”。

于 2012-10-26T10:49:47.643 回答