• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
下位互換コード隠蔽のストイシズム
 

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

on

  • 8,269 views

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

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

Statistics

Views

Total Views
8,269
Views on SlideShare
1,405
Embed Views
6,864

Actions

Likes
8
Downloads
9
Comments
0

9 Embeds 6,864

http://techblog.yahoo.co.jp 4672
http://himaratsu.hatenablog.com 1901
http://cptl.corp.yahoo.co.jp 188
http://mt01-cms.corp.yahoo.co.jp 86
http://hatebutv.com 8
https://twitter.com 3
http://feedly.com 3
http://newsblur.com 2
http://webcache.googleusercontent.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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