取り立てて新しいものではありませんが個人的に欲しかったので作りました。単一機能に絞り、シンプルで使い勝手の良いアプリを目指しました。小さなアプリなので開発面では Autolayout や Storyboardを実戦で使う良い機会になりました。
半透明効果には下記のライブラリを使っています。iOS7っぽいところを出したいと思い、多少デザインの統一感が崩れますが入れてみました。
Kickシリーズはもう一本作ろうと思ってます。
無料なので良ければお試し下さい。
iOS/iPhone/iPad/MacOSX プログラミング, Objective-C, Cocoaなど
2013年11月12日火曜日 | Published in アプリ紹介 | 0 コメント
2013年9月16日月曜日 | Published in アプリ紹介 | 0 コメント
2013年7月20日土曜日 | Published in Viewing Fun !, アプリ紹介 | 0 コメント
2013年7月18日木曜日 | Published in Blocks, Tips | 0 コメント
戻り値 (^名前) (引数)(私が勝手に決めた)基本型はこれ。これを覚えないことには始まらない。とにかくこれだけは覚える。
(例)BOOL (^completion)(BOOL canceled) = ...;この基本型を元に各場面でどう使うかを見ていく。
戻り値 (^名前) (引数) = …;typedef宣言なら
typedef 戻り値 (^名前) (引数);両方とも基本型がそのまま使える。
(例)typedef BOOL (^LKCompletion)(BOOL canceled);
@property (copy) 戻り値 (^名前) (引数)Blocksをプロパティ宣言する場合は copy にしておくのがポイント。
(例)@property (copy) BOOL (^completion)(BOOL canceled);
(例)- (void)loadImageCompletion:(BOOL(^)(BOOL canceled))completion;ただ落ち着いて見るとObjective-C標準のメソッド引数の書式に従って基本型を変形しているだけなので実は難しくない。
戻り値 (^名前) (引数) ※基本型 ↓ ↓ 名前を後ろへ切り出す ←メソッド引数名は最後にくるから ↓ 戻り値 (^) (引数)名前 ↓ ↓ 引数の型となる範囲を( )で囲う ←メソッド標準の書き方 ↓ (戻り値 (^) (引数)) 名前基本型をメソッド引数の書き方に合わせたものだと覚えておくといい。
^戻り値 (引数) {...}やはりBlocks構文を覚えくくさせている原因の一つ。基本型と書き方が異なる。
(例)BOOL (^display)(BOOL animated) = ^BOOL(BOOL animated) {return YES;};こちらはメソッド引数の時と異なり変形ルールが想定できない。仕方がないので基本型同様に暗記する。なおメソッド引数にBlocks定義を記述する場合、Xcodeならコーディング時にBlocksの書式を補完してくれる。この為記憶を頼りに記述するケースは実際には多くないかもしれない。
(例)[hoge loadImageCompletion:^BOOL(BOOL canceled) { : }];
戻り値 (^名前) (引数)
^戻り値(引数) {...}それ以外は基本型がそのまま使えるのと、メソッド引数の場合は基本型の応用なので変形ルールを知っておけば書式を無理に覚える必要は無い。またBlocks定義を書く時は、多くの場合 Xcodeが補完してくれるので覚えておく必要性は基本型に比べると実は少ない(人によるが)。なので、乱暴に言えば基本型だけ覚えればどうにかなる。
BOOL (^execute)(void) = …; ↓ BOOL (^execute)( ) = …;
- (void)displayScreen:(void(^)(void))didAppear; ↓ - (void)displayScreen:(void (^)( ))didAppear;
(例)^void (void) { … } ↓ ^(void) { … }Blocks定義の場合、引数が voidならさらに引数のカッコ ()自体も省略できる。
(例)^{ … }よく見かける ^{...} は実は ^void(void){...} が省略されたもの。
○ @property (copy) void (^didAppear)(BOOL animated); ☓ @property (copy) (^didAppear)(BOOL animated);
2013年4月21日日曜日 | Published in Objective-C, Tips | 1 コメント
[SomeClass sharedInstance] ↓ SomeClass.sharedInstance当然ながらさらにメソッドも重ねられる。
SomeClass.sharedInstance.localNameXcodeではクラスメソッドの.表記は補完が効かないのが難点。ただしそれ以降のメソッドは補完してくれる。
SomeClass* obj = [[SomeClass] alloc] init]; ↓ SomeClass* obj = [SomeClass new];. を使えばさらに短くサクっと書ける
SomeClass* obj = SompeClass.new;+new は NSObjectで定義されている(new = alloc+initとの説明がある)
This method is a combination of alloc and init.NSObject Class Reference
+ (instancetype)sharedInstance { SomeClass* obj = [[self alloc] init]; : : }さらに . と new を使えばこう書ける。
SomeClass* obj = self.new;
NSDictionary* dict = @{} NSMutableDictionary* dict = @{}.mutableCopy;
NSArray* array = @[] NSMutableArray* array = @[].mutableCopy;
2013年4月20日土曜日 | Published in XPC | 0 コメント
+ (BOOL)supportsSecureCoding;
id obj = [decoder decodeObjectForKey:@"myKey"]; if (![obj isKindOfClass:[MyClass class]]) {...fail...}2行目でクラスチェックを行っているが実際には1行目でインスタンス化されていて既にその時点でクラスおよびインスタンスのイニシャライザは起動している。つまり現状では仮に不正なクラスが読み込み対象のファイルに紛れ込んでもその初動を防ぐことができない。
id obj = [decoder decodeObjectOfClass:[MyClass class] forKey:@"myKey"];もし
(a)指定クラスがNSSecureCodingを実装している (b)指定クラスとロードするクラスが一致するのどちらかを満たさない場合は例外がスローされ、インスタンスの作成は行われない。これにより不正な振る舞いを防ぐことができる。なおこのチェックを有効にするには -[NScoder requiresSecureCoding]でYESを返すようにしておく必要がある(NOだとチェックは働かず実質 decodeObjectforKey:と変らない)。
[a] initWithCoder: をオーバーライドしない [b] initWithCoder: をオーバーライドする場合、decodeObjectOfClass:forKey: を使うさらに + supportsSecureCodingをオーバーライドして、YESを返す必要がある。
2013年1月1日火曜日 | Published in 連絡 | 0 コメント