iOS

自作ライブラリを CocoaPods でインストールできるようにした

ADBannerView を画面下に配置するオレオレライブラリ TNAAdController を使うとき、 ファイルをプロジェクトに追加して使っていた。 これだとソースコードが分散してしまって、コピペと変わらない。 よろしくないので、CocoaPods でインストールできるように…

UITableView の下に ADBannerView を配置するだけのライブラリ書いた

UITableView の下に ADBannerView を置くのは、無料+広告アプリでは定番レイアウト。 自分が作る iOS アプリでも採用している。 以前、 っていう記事を書いたけど、この方法はもう使っていない。 UITableView のフッターを設定しているので、表示データが 0 …

Objective-C のカテゴリでプロパティを定義する方法のメモ

objc/runtime.h で定義されている、objc_getAssociatedObject メソッドと objc_setAssociatedObject を使う。 #import <UIKit/UIKit.h> @interface UIViewController (SideMenu) @property (nonatomic, readonly) UIBarButtonItem *menuButtonItem; @end #import "UIViewCon</uikit/uikit.h>…

RubyMotion で MagicalRecord を使う

最近、RubyMotion 向けのラッパー gem じゃなくて、 Objective-C のライブラリを使ったほうがいいのでは、って思うようになってきた。 CoreData なら MotionData や MotionDataWrapper じゃなくて MagicalRecord。 そこで RubyMotion で MagicalRecord が使…

RubyMotion で CoreData を使うとき Xcode で作成した Data Model をラッパー gem なしで読み込む

先日 RubyMotion で CoreData を使うために試した MotionDataWrapper、 ソースコードを見たらシンプルな実装で難しいことやっていなかった。 Xcode の Data Modeler で作成したエンティティ定義を読み込むけど、 それは CoreData.framework が提供している機…

UITableViewCell の imageView をタップしたとき処理を行う方法

UITapGestureRecognizer を使う。 ついでに、タップされた位置からセルの indexPath も取得してみる。 // タップされた位置からセルの indexPath を取得 - (void)imageViewTouched:(UITapGestureRecognizer*)sender { CGPoint point = [sender locationInVie…

FontAwesomeKit の使い勝手が良かったので移行した話

FontAwesome-iOS、motion-fontawesome を経て、 今は FontAwesomeKit を使っている。 PrideChung/FontAwesomeKit FontAwesomeKit は開発が活発なので、最新の FontAwesome 4.0.3 に対応している。 しかも FontAwesomeKit という名前なのに、FontAwesome 以外…

MotionDataWrapper を使ったモデルのスペックを書く

CoreData を使ったモデルのスペックを書く場合、NSManagedObjectContext などのセットアップと、 テストデータの後始末が面倒。 このうちセットアップは MotionDataWrapper が楽にしてくれる。 あとは後始末だけど、こいつも MotionDataWrapper の spec にお…

MotionDataWrapper と NSFetchedResultsController を組み合わせる

MotionDataWrapper を使うと、CoreData を ActiveRecord ライクに扱えるため、 # すべてのエントリを配列で取得 all_entries = Entry.all # 下書きのみを配列で取得 draft_entries = Entry.where("draft = ?", true).all という風に、簡単にデータを取得でき…

RubyMotion で FontAwesome を使う

自分はデザインが苦手、特にアイコンが作れないので、 FontAwesome を重用している。 これがないとアプリ開発できないと言ってもいいくらい。 当然、RubyMotion でも使いたい。 前に Objective-C で FontAwesome を使ったときと同じ方法 を採用してもいいけ…

MotionDataWrapper で多対多のリレーションシップを実現する

MotionDataWrapper を使って、ブログのエントリとカテゴリみたいな、 多対多のリレーションシップに挑戦した。 すんなりいくだろうと思っていたけど、意外に嵌ってしまったので、 メモを残しておく。 エンティティとリレーションシップの定義 Xcode Data Mod…

RubyMotion のデバッガが LLDB になっていた

気づいたら、RubyMotion のデバッガが GDB から LLDB に変わっていた。 どうやら、iOS 7 から LLDB しか SDK に含まれないようになったためらしい。 @t_nakamura iOS 7 から LLDB しか SDK に含まれないようになったので、それに併せて GDB から LLDB に切り…

Formotion の Date row と Subform row で嵌った

Grouped スタイルの UITableView を使ったフォームを簡単に作成できる、 RubyMotion 用の gem 『Formotion』が便利。 clayallsopp/formotion 文字列入力や数値入力やスイッチなど、たいていの入力は README 読めば使える。 ただ自分の場合、日付選択とサブフ…

MotionDataWrapper

はじめに 「RubyMotion で CoreData を使うなら MotionData を導入した方がいい」って勧めておいてなんだけど、 その後『MotionDataWrapper』を知って速攻で移行してしまった。 macfanatic/motion_data_wrapper MotionDataWrapper の特徴 MotionData は Data…

RubyMotion で CoreData を使うなら MotionData を導入した方がいい

RubyMotion で CoreData が使えることは確認できた。 * ただ、CoreData のエンティティ定義をコードで書くのは結構シンドイ。 NSManagedObjectContext の初期化や CRUD を含めると、CoreData だけでかなりのコードを書くことになる。 正直、CoreData のラッ…

RubyMotion で CoreData を使う

# -*- coding: utf-8 -*- $:.unshift("/Library/RubyMotion/lib") require 'motion/project/template/ios' begin require 'bundler' Bundler.require rescue LoadError end Motion::Project::App.setup do |app| app.name = 'CoreDataSample' app.frameworks…

Objective-C で流れるようなインタフェース

Underscore.js にインスパイアされた Objective-C のライブラリ Underscore.m を試してみたんだけど、 その使い方にちょっと驚いた。 流れるようなインタフェースで書けるじゃないか。 例えば、公式ページのサンプル。 NSDictionary *dictionary = @{ @"en":…

iAd を画面下に固定する方法

UITableView を画面いっぱいに表示し、広告を画面下に表示するというのは、 よくある組み合わせだと思う。 このとき、UITableView をスクロールしても、広告は画面下に固定して、ずっと表示していたい。 ただし、Apple の審査に通るために、広告の取得に失敗…

CoreData で複数の条件で絞り込む方法

NSPredicate を作成して NSFetchRequest に設定する。これが基本。 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"price > %d", 1000]; [request setPredicate:predicate]; 値段と数量、といった複数の条件で絞り込みたい場合。 条件が固定…

iOS で FontAwesome を使う方法

はじめに Inkscape でツールバー用のアイコンを作成していたけど、 すべてのアイコンで通常用とRetina用の2種類作成する必要があってウンザリ。 アイコンが必要になるたび思う。 「FontAwesome みたいなアイコンフォントが使えれば」って。 FontAwesome+iOS …

SVProgressHUDでインジケーターを閉じるときの注意

SVProgressHUD は // インジケーター表示 [SVProgressHUD showWithStatus:@"Sending..."]; // 終了 [SVProgressHUD dismiss]; というコードで簡単にカッコいいインジケーターを表示できて重宝してる。 ただ、普段インジケーターを閉じるのに dismiss を使っ…

AFHTTPClient の getPath が送信するリクエストのクエリ文字列で試行錯誤した話

AFHTTPClient の getPath に [client getPath:@"user/tasks" parameters:@{ @"status": @[@"completed", @"new"] } success:^(AFHTTPRequestOperation *operation, id responseObject) { } failure:^(AFHTTPRequestOperation *operation, NSError *error) { …

Objective-C で動的にメソッドを追加する

Objective-C でも、Ruby みたいに動的にメソッドを追加することができた。 ということは、Objective-C でもメタプログラミングができるね。 今のところ、セレクタを引数に受け取るメソッドのテストで重宝している。 #import "MyTests.h" #import <objc/runtime.h> @implement</objc/runtime.h>…

ViewController でナビゲーションバーの戻るボタンがタップされたかどうか判定する方法

viewWillDisappear の中で、ナビゲーションコントローラーの管理下に自分自身が含まれているかチェックし、含まれていなければ戻るボタンがタップされたと判断できた。 - (void)viewWillDisappear:(BOOL)animated { if ([self.navigationController.viewCont…

OCMock を使って AFHTTPClient のサブクラスをテストする

例えば、AFHTTPClient を継承したカスタムクライアントがあるとする。 #import <Foundation/Foundation.h> #import <AFNetworking/AFHTTPClient.h> @interface TodoClient : AFHTTPClient - (void)getTodoList:(void(^)(NSArray*))success failure:(void(^)(NSError*))failure; @end #import "TodoClient.h" @implem</afnetworking/afhttpclient.h></foundation/foundation.h>…

AFNetworking でベーシック認証に対応する方法

久しぶりの Objective-C。 定番通信ライブラリ『AFNetworking』で、ベーシック認証が設定された Web API にアクセスする方法を README や Github の Wiki で調べてみた。 さっぱりわからない。 仕方ないので、ソースコード読んだり、StackOverflow 漁ったり…

NSString のプロパティに NSNull が入っていてハマった

オブジェクトのプロパティの値を UITextField の text に設定しようとしたら 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x2264678'っていうエラーが出てアプリが落ちた。nil が入っているなら例外…

SSKeychain を使って Keychain Service にパスワードを保存したみた

例えば、Web サービスの iPhone クライアントの場合、ユーザーに Web サービスのアカウント名とパスワードを入力してもらう必要がある。で、入力してもらったパスワードを安全に保存しなきゃいけないんだけど、嬉しいことに iOS は Keychain Service という…

入力時にキーボードで隠れないように UITextField を UIToolbar に配置する方法

iPhone 画面下のツールバーにテキストボックスとボタンを配置して、コメント投稿バーみたいなやつを作ってみた。Storyboard からはツールバーにテキストボックスを直接配置できないけど、テキストボックスを UIBarButtonItem でくるんでツールバーに追加する…

UIActivityIndicatorView を使って画面中央にインジケーターを表示してみた

Web API を呼び出している間、画面に何のデータも表示しないってのはユーザーを不安にさせるので、画面中央にインジケーターを表示することにした。標準で UIActivityIndicatorViwe というシンプルなインジケーターが提供されているので、こいつを使ってみる…