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

9,941 views

Published on

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

Published in: Technology, Travel
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,941
On SlideShare
0
From Embeds
0
Number of Embeds
7,708
Actions
Shares
0
Downloads
11
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

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

  1. 1. 下位互換コード 隠蔽のストイシズム @taketo1024 14年1月15日水曜日
  2. 2. 14年1月15日水曜日
  3. 3. @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO; } . . . @end 14年1月15日水曜日
  4. 4. 14年1月15日水曜日
  5. 5. 14年1月15日水曜日
  6. 6. iOS 6 互換 14年1月15日水曜日
  7. 7. if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO; } 14年1月15日水曜日
  8. 8. if([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) { self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO; } 14年1月15日水曜日
  9. 9. if(iOSVersionOver(@"7.0")) { self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO; } 14年1月15日水曜日
  10. 10. 分岐処理は美しくない 14年1月15日水曜日
  11. 11. アプリ本体のコードから OS分岐処理を消したい 14年1月15日水曜日
  12. 12. 方針1: 拡張カテゴリで iOS 6 互換メソッドを追加 14年1月15日水曜日
  13. 13. @interface UIViewController(iOS6Compatibilized) @property (nonatomic) UIRectEdge iOS6_edgesForExtendedLayout; @property (nonatomic) BOOL iOS6_automaticallyAdjustsScrollViewInsets; @end UIViewController+iOS6Compaibilized.h 14年1月15日水曜日
  14. 14. @implementation UIViewController (iOS6Compatibilized) - (UIRectEdge)iOS6_edgesForExtendedLayout { if(iOSVersionOver(@"7.0")) { return self.edgesForExtendedLayout; } else { return UIRectEdgeAll; } } . . . UIViewController+iOS6Compaibilized.m 14年1月15日水曜日
  15. 15. @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; self.iOS6_edgesForExtendedLayout = UIRectEdgeAll; self.iOS6_automaticallyAdjustsScrollViewInsets = NO; } MyViewController.m 14年1月15日水曜日
  16. 16. イマイチ美しくない 14年1月15日水曜日
  17. 17. @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; self.iOS6_edgesForExtendedLayout = UIRectEdgeAll; self.iOS6_automaticallyAdjustsScrollViewInsets = NO; } MyViewController.m 14年1月15日水曜日
  18. 18. @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO; } MyViewController.m 14年1月15日水曜日
  19. 19. 方針2: UIViewController サブクラスを作る 14年1月15日水曜日
  20. 20. @interface UIViewController_iOS6 : UIViewController @end UIViewController_iOS6.h 14年1月15日水曜日
  21. 21. - (UIRectEdge)edgesForExtendedLayout { if(iOSVersionOver(@"7.0")) { return super.edgesForExtendedLayout; } else { return UIRectEdgeAll; } } . . . UIViewController_iOS6.m 14年1月15日水曜日
  22. 22. #import "UIViewController_iOS6.h" @interface MyViewController : UIViewController_iOS6 @end MyViewController.h 14年1月15日水曜日
  23. 23. @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO; } MyViewController.m 14年1月15日水曜日
  24. 24. 必ずコレを継承しなきゃ いけないのは嫌 14年1月15日水曜日
  25. 25. アプリ本体のコードには全く 手を付けないのがストイック 14年1月15日水曜日
  26. 26. @interface MyViewController : UIViewController @end MyViewController.h 14年1月15日水曜日
  27. 27. @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; self.automaticallyAdjustsScrollViewInsets = NO; } MyViewController.m 14年1月15日水曜日
  28. 28. 方針3: 拡張カテゴリ +動的メソッド追加 14年1月15日水曜日
  29. 29. @interface UIViewController(iOS6Compatibilized) @end UIViewController+iOS6Compaibilized.h 14年1月15日水曜日
  30. 30. @implementation UIViewController (iOS6Compatibilized) - (UIRectEdge)iOS6_edgesForExtendedLayout { return UIRectEdgeAll; } - (void)iOS6_setEdgesForExtendedLayout: (UIRectEdge)edge { // do nothing } (続く) UIViewController+iOS6Compaibilized.m 14年1月15日水曜日
  31. 31. (続き) - (BOOL)iOS6_automaticallyAdjustsScrollViewInsets { return NO; } - (void)iOS6_setAutomaticallyAdjustsScrollViewInsets: (BOOL)automaticallyAdjustsScrollViewInsets { // do nothing } (続く) UIViewController+iOS6Compaibilized.m 14年1月15日水曜日
  32. 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.m 14年1月15日水曜日
  33. 33. + (void)load { [self compatibilizeInstanceMethodOfSelector:@selector(edgesForExtendedLayout) withSelector:@selector(iOS6_edgesForExtendedLayout)]; [self compatibilizeInstanceMethodOfSelector:@selector(setEdgesForExtendedLayou t:) withSelector:@selector(iOS6_setEdgesForExtendedLayout:)]; [self compatibilizeInstanceMethodOfSelector:@selector(automaticallyAdjustsScro llViewInsets) withSelector:@selector(iOS6_automaticallyAdjustsScrollViewInsets)]; [self compatibilizeInstanceMethodOfSelector:@selector(setAutomaticallyAdjustsS crollViewInsets:) withSelector:@selector(iOS6_setAutomaticallyAdjustsScrollViewInsets:)]; } @end UIViewController+iOS6Compaibilized.m 14年1月15日水曜日
  34. 34. ストイックである。 14年1月15日水曜日
  35. 35. 補足: class_addMethod() は 既にメソッドが存在する場合は何もしない 14年1月15日水曜日
  36. 36. 補足: +(void)load は 拡張カテゴリ毎に呼ばれる 14年1月15日水曜日
  37. 37. iOS 7 で追加されたクラス/メソッドを 全部作り直せば、iOS 7 のコードのま ま iOS 6 対応ができる。 14年1月15日水曜日
  38. 38. どこまでストイックに やるかはあなた次第。 14年1月15日水曜日
  39. 39. Thank you. @taketo1024 14年1月15日水曜日

×