下位互換コード隠蔽のストイシズム

39
下位互換コード 隠蔽のストイシズム @taketo1024 14115日水曜日

Upload: taketo-sano

Post on 10-May-2015

8.781 views

Category:

Technology


4 download

DESCRIPTION

サンプルコード: https://github.com/taketo1024/iOS6CompatibilizerDemo

TRANSCRIPT

Page 1: 下位互換コード隠蔽のストイシズム

下位互換コード隠蔽のストイシズム

@taketo1024

14年1月15日水曜日

Page 2: 下位互換コード隠蔽のストイシズム

14年1月15日水曜日

Page 3: 下位互換コード隠蔽のストイシズム

@implementation ViewController

- (void)viewDidLoad{ [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO;}

.

.

.

@end

14年1月15日水曜日

Page 4: 下位互換コード隠蔽のストイシズム

14年1月15日水曜日

Page 5: 下位互換コード隠蔽のストイシズム

14年1月15日水曜日

Page 6: 下位互換コード隠蔽のストイシズム

iOS 6 互換

14年1月15日水曜日

Page 7: 下位互換コード隠蔽のストイシズム

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO;

}

14年1月15日水曜日

Page 8: 下位互換コード隠蔽のストイシズム

if([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) {

self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO;

}

14年1月15日水曜日

Page 9: 下位互換コード隠蔽のストイシズム

if(iOSVersionOver(@"7.0")) { self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO;}

14年1月15日水曜日

Page 10: 下位互換コード隠蔽のストイシズム

分岐処理は美しくない

14年1月15日水曜日

Page 11: 下位互換コード隠蔽のストイシズム

アプリ本体のコードからOS分岐処理を消したい

14年1月15日水曜日

Page 12: 下位互換コード隠蔽のストイシズム

方針1: 拡張カテゴリで

iOS 6 互換メソッドを追加

14年1月15日水曜日

Page 13: 下位互換コード隠蔽のストイシズム

@interface UIViewController(iOS6Compatibilized)

@property (nonatomic) UIRectEdge iOS6_edgesForExtendedLayout;

@property (nonatomic) BOOL iOS6_automaticallyAdjustsScrollViewInsets;

@end

UIViewController+iOS6Compaibilized.h14年1月15日水曜日

Page 14: 下位互換コード隠蔽のストイシズム

@implementation UIViewController (iOS6Compatibilized)

- (UIRectEdge)iOS6_edgesForExtendedLayout{ if(iOSVersionOver(@"7.0")) { return self.edgesForExtendedLayout; } else { return UIRectEdgeAll; }}

.

.

.

UIViewController+iOS6Compaibilized.m14年1月15日水曜日

Page 15: 下位互換コード隠蔽のストイシズム

@implementation MyViewController

- (void)viewDidLoad{ [super viewDidLoad]; self.iOS6_edgesForExtendedLayout = UIRectEdgeAll; self.iOS6_automaticallyAdjustsScrollViewInsets = NO;}

MyViewController.m14年1月15日水曜日

Page 16: 下位互換コード隠蔽のストイシズム

イマイチ美しくない

14年1月15日水曜日

Page 17: 下位互換コード隠蔽のストイシズム

@implementation MyViewController

- (void)viewDidLoad{ [super viewDidLoad]; self.iOS6_edgesForExtendedLayout = UIRectEdgeAll; self.iOS6_automaticallyAdjustsScrollViewInsets = NO;}

MyViewController.m14年1月15日水曜日

Page 18: 下位互換コード隠蔽のストイシズム

@implementation MyViewController

- (void)viewDidLoad{ [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO;}

MyViewController.m14年1月15日水曜日

Page 19: 下位互換コード隠蔽のストイシズム

方針2: UIViewControllerサブクラスを作る

14年1月15日水曜日

Page 20: 下位互換コード隠蔽のストイシズム

@interface UIViewController_iOS6 : UIViewController

@end

UIViewController_iOS6.h14年1月15日水曜日

Page 21: 下位互換コード隠蔽のストイシズム

- (UIRectEdge)edgesForExtendedLayout{ if(iOSVersionOver(@"7.0")) { return super.edgesForExtendedLayout; } else { return UIRectEdgeAll; }}

.

.

.

UIViewController_iOS6.m14年1月15日水曜日

Page 22: 下位互換コード隠蔽のストイシズム

#import "UIViewController_iOS6.h"

@interface MyViewController : UIViewController_iOS6

@end

MyViewController.h14年1月15日水曜日

Page 23: 下位互換コード隠蔽のストイシズム

@implementation MyViewController

- (void)viewDidLoad{ [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO;}

MyViewController.m14年1月15日水曜日

Page 24: 下位互換コード隠蔽のストイシズム

必ずコレを継承しなきゃいけないのは嫌

14年1月15日水曜日

Page 25: 下位互換コード隠蔽のストイシズム

アプリ本体のコードには全く手を付けないのがストイック

14年1月15日水曜日

Page 26: 下位互換コード隠蔽のストイシズム

@interface MyViewController : UIViewController

@end

MyViewController.h14年1月15日水曜日

Page 27: 下位互換コード隠蔽のストイシズム

@implementation MyViewController

- (void)viewDidLoad{ [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO;}

MyViewController.m14年1月15日水曜日

Page 28: 下位互換コード隠蔽のストイシズム

方針3: 拡張カテゴリ

+動的メソッド追加

14年1月15日水曜日

Page 29: 下位互換コード隠蔽のストイシズム

@interface UIViewController(iOS6Compatibilized)

@end

UIViewController+iOS6Compaibilized.h14年1月15日水曜日

Page 30: 下位互換コード隠蔽のストイシズム

@implementation UIViewController (iOS6Compatibilized)

- (UIRectEdge)iOS6_edgesForExtendedLayout{ return UIRectEdgeAll;}

- (void)iOS6_setEdgesForExtendedLayout:(UIRectEdge)edge{ // do nothing}

(続く)

UIViewController+iOS6Compaibilized.m14年1月15日水曜日

Page 31: 下位互換コード隠蔽のストイシズム

(続き)

- (BOOL)iOS6_automaticallyAdjustsScrollViewInsets{ return NO;}

- (void)iOS6_setAutomaticallyAdjustsScrollViewInsets:(BOOL)automaticallyAdjustsScrollViewInsets{ // do nothing}

(続く)

UIViewController+iOS6Compaibilized.m14年1月15日水曜日

Page 32: 下位互換コード隠蔽のストイシズム

(続き)

+ (void)compatibilizeInstanceMethodOfSelector:(SEL)selector withSelector:(SEL)compatible{ Method method = class_getInstanceMethod(self, compatible);

class_addMethod(self, selector, method_getImplementation(method), method_getTypeEncoding(method));

}

(続く)

UIViewController+iOS6Compaibilized.m14年1月15日水曜日

Page 33: 下位互換コード隠蔽のストイシズム

+ (void)load{ [self compatibilizeInstanceMethodOfSelector:@selector(edgesForExtendedLayout) withSelector:@selector(iOS6_edgesForExtendedLayout)];

[self compatibilizeInstanceMethodOfSelector:@selector(setEdgesForExtendedLayout:) withSelector:@selector(iOS6_setEdgesForExtendedLayout:)];

[self compatibilizeInstanceMethodOfSelector:@selector(automaticallyAdjustsScrollViewInsets) withSelector:@selector(iOS6_automaticallyAdjustsScrollViewInsets)];

[self compatibilizeInstanceMethodOfSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:) withSelector:@selector(iOS6_setAutomaticallyAdjustsScrollViewInsets:)];

}

@end

UIViewController+iOS6Compaibilized.m14年1月15日水曜日

Page 34: 下位互換コード隠蔽のストイシズム

ストイックである。

14年1月15日水曜日

Page 35: 下位互換コード隠蔽のストイシズム

補足:class_addMethod() は

既にメソッドが存在する場合は何もしない

14年1月15日水曜日

Page 36: 下位互換コード隠蔽のストイシズム

補足:+(void)load は

拡張カテゴリ毎に呼ばれる

14年1月15日水曜日

Page 37: 下位互換コード隠蔽のストイシズム

iOS 7 で追加されたクラス/メソッドを全部作り直せば、iOS 7 のコードのま

ま iOS 6 対応ができる。

14年1月15日水曜日

Page 38: 下位互換コード隠蔽のストイシズム

どこまでストイックにやるかはあなた次第。

14年1月15日水曜日

Page 39: 下位互換コード隠蔽のストイシズム

Thank you.@taketo1024

14年1月15日水曜日