hachinoBlog

hachinobuのエンジニアライフ

iOS7でstatusbar(ステータスバー)を消す方法

iOS7がリリースされましたね。 きっとNDAも解除されたろうと思いiOS7関連情報を綴ります。iOS7になったことで全体のデザインがフラットデザインになりました。 この影響で僕のアプリはステータスバーの20px領域にViewが食い込むようになってました。 ステー…

OCMockのスタブでメソッドでなくプロパティの返り値を制御する方法

テストケースを書く際にOCMockのスタブを使用してメソッドの返り値を制御することが多々あると思います。 メソッドだけじゃなくて、そのクラスで定義されているプロパティの返り値を制御するのに四苦八苦したのでメモります。 メソッドのスタブと同じように…

NSArrayのenumerateObjectsUsingBlockメソッド

配列データに該当の値が存在するか調べる際に配列データをループして調べるが、 今までは for (int i = 0; i for (id obj in array) //高速列挙 を使用していた。NSArrayにはenumerateObjectsUsingBlockメソッドがあり便利なので記述する。 @interface ViewC…

NSDictionaryデータ⇔自作オブジェクトに変換する方法

Appleのサンプルコードで発見したNSDictionaryと自作オブジェクトの相互変換メソッド。 NSDictionaryのデータを自作オブジェクトに変換してくれるのがsetValuesForKeysWithDictionary 自作オブジェクトのデータをNSDictionaryにしてくれるのがdictionaryWith…

テーブルビューのページング処理(最下セルまでスクロールしたら次の○件を自動で取得して表示する)

テーブルビューで一番下のセルまでスクロールしたら自動で次の○件を取得する処理について調べた。 この処理で一番のポイントはどのタイミングで次の○件を取得して表示を更新すべきかというところ。 まず最初に試した方法はUITableViewDelegateのwillDisplayC…

UIWebViewのCookie削除方法

アプリでfacebookアカウントを使用してWebサービスログイン機能実装していた際に一度facebookアカウントでログインしてからログアウト。 その後に再度facebookログインを試みるとIDとPWを求められることなく先ほどまでログインしていたアカウントで勝手にロ…

UINavigationControllerのnavigationBar領域をViewで覆うやり方

ある処理をする際に他画面に遷移されたりボタン操作をされたくなかったので新たにViewを作成して対象画面にaddSubViewして覆っていたのだがnavigationBarの領域にあるボタンは押せてしまっていた。navigationBar領域を覆えないコード CGRect frame = self.vi…

自宅のCentOSにGitサーバを構築してみた

CentOS6.4にGitサーバを構築したのでメモ[サーバ側] # yum install git git-deamon git-all xinetd # chkconfig xinetd on # /etc/init.d/xinetd start xinetd を起動中: [ OK ] 必要なものをインストールして起動設定が終わったらgit-daemonファイルを/etc/…

countForFetchRequestは重複を除く件数は取得してくれない?

CoreDataを使用していて、あるカラムの重複を除いたデータの件数を取得する際に setReturnsDistinctResults:YESの設定をして managedObjectContextのcountForFetchRequestメソッドで取得したが重複を除いた件数ではなく重複を含む件数を取得してしまった。 …

TableViewのセル表示高速化 〜高さが動的に変わるセル対応編〜

表示するコンテンツの有無に応じて高さが変わるカスタムセルを表示する際にえらく時間が掛かってしまっていたのを改善したメモ。 (カスタムセルはUILabelを縦に4個配置しているもので上から順に詰めていく。UILabelの高さはすべて25.0fで固定) 時間がかかっ…

Objective-CのNull判定

あるサイトのAPIのレスポンスデータ(JSON)にNullが含まれていて、そのデータをCoreDataに挿入する際にNull判定の仕方を間違えていてエラーが発生した。 nilとNullの違いをきちんと分かっていなかったのが原因。 エラーが起きたのはNull判定を下記のようにや…

EventKitを使ってカレンダーに登録する方法(iOS6系対応)

EventKitを使って端末カレンダー連携をする際にiOS6系からはプライバシー設定が導入されたので、 アプリから端末カレンダーを操作する許可がない状態でEKEventStoreにアクセスするとクラッシュする。 対応方法としては 1. 端末のiOSが6系以降かどうか調べる …

Rubyのバッチ処理でActiveRecordを使ってモデルクラス経由でのDB接続方法

Rubyでバッチ処理を書いているのだがDBへの接続で苦戦した。 RailsのActiveRecordのように簡単に出来るものだと思っていたのだがそうもいかず.. しかしrails runnerを使えばRails同様のアクセス方法でいけるという事を知りました。 まずは準備としてconfig/a…

EventKitを使ってカレンダーに登録する方法(iOS5系)

アプリ内の情報を端末カレンダーに送信するメモ 1. EventKit.frameworkを入れる 2. EKEventStoreのインスタンス生成 (初期化して解放まで重いのでシングルトンとかにして使い回す設計にする) 3. EKEventのインスタンスを生成してタイトルなど送信したい情報…

CoreDataでThe model used to open the store is incompatible with the one used to create the storeエラー

CoreDataのモデルファイルにカラムを追加して再度ビルドしたところ下記エラーが出た。 error:{ metadata = { NSPersistenceFrameworkVersion = 419; NSStoreModelVersionHashes = { EntityA = <3159d1ee 37851832 a788a9a2 fae591d2 4d0f7a24 73d33faf 2384d…

GHUnitの導入方法

GHUnitを使ってテストをすることにした。 ここの通りにやれば導入は簡単にできた。 http://www.crossbridge.biz/ghunit-iosひとつ注意としてはGHUnitテスト用の[TARGETS]-[Build Settings]-[Build Options]-[Compiler for C/C++ /Objective-C]がLLVM GCC4.2…

カスタムセルを使う方法(xibファイル)

カスタムセルを使う方法で色々ハマってしまったのでメモ。 xibファイルを使わずにUITabaleViewCellを継承したクラスを作成した場合は UITableViewDataSourceのcellForRowAtIndexPathで下記のように記述 - (UITableViewCell *)tableView:(UITableView *)table…

iOS5系でNSURLConnectionを使った場合のタイムアウト設定方法

ネットワーク処理でNSURLConnectionを使っているとiOS5系でのみ設定したタイムアウト時間よりも遥かに長く待たされた。 どうやらアップルの仕様でNSURLRequestでPOSTかつbodyに値を設定するとそうなるみたい。問題のコードは下記 NSMutableURLRequest *reque…

自クラスのインスタンスメソッド内でクラスメソッドを呼ぶ方法

自クラスのインスタンスメソッドから自クラスのクラスメソッドは //クラスメソッド + (void)classMethod { //クラスメソッド処理 } //インスタンスメソッド - (void)instanceMethod { [self classMethod]; //これじゃ呼べない }上記のやり方では呼べない。 …

今更ながらNSDictionary,NSArrayへの新しいアクセス方法

今更感満載ですが、NSDictionaryとNSArrayのモダン記法です。 以前の書き方は //NSDictionary NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"hachinobu", @"name", [NSNumber numberWithInt:28], @"age", nil]; NSString *name = [dic …

UIAlertがフリーズする現象

UIAlertViewを表示した瞬間にホームボタンでバックグラウンドへいき再度アプリを開くとUIAlertViewが出たまま画面がフリーズ状態になった。 問題が起きたのは下記コード + (void) simpleSuccessWithTitle:(NSString *)title message:(NSString *)message del…

TableViewで特定のセルだけ編集モードにしない方法

canMoveRowAtIndexPathメソッドでセルを特定して判定してやる - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ //セルの取得 UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (取得…

CoreData: The fetched object at index x has an out of order section name xxxxxx. Objects must be sorted by section name

CoreDataを使用したコードでNSFetchedResultsControllerを作成する際に 下記コードのようにsectionNameKeyPathにEntityモデルのカラムを連結した値をセットして実行したら - (NSFetchedResultsController *)fetchedResultsController { if (_fetchedResultsC…

CoreDataのモデルファイル(.xcdatamodeld)の名前を変更する方法

モデルファイルを変更したくてハマった。 まず、before.sqlite → after.sqlite にリネーム。 次に、before.xcdatamodeld → after.xcdatamodeld にリネームしてビルドするとCoreDataに接続する処理で 'NSInvalidArgumentException', reason: 'Cannot create a…

CopyPNGFile Error

プロジェクトフォルダから要らない画像ファイルを削除して起動してみたところ CopyPNGFile /Users/.../xxx.png Command /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/copypng failed with exit code 1 という…

配列を降順にソートする方法

配列の昇順は簡単なんだけど降順になると色々とやり方があるので迷ったのだけど 普段からCoreDataを使用していたのでNSSortDescriptorを使った下記やり方が一番簡単に思えた。 NSSortDescriptor *sortDesc = [[[NSSortDescriptor alloc] initWithKey:@"" asc…

dispatch_asyncのバックグラウンド処理でUIをいじってはいけない

メインスレッドを止めないためにdispatch_asyncを使ってネットワーク処理をバックグラウンドで行っていた。 ネットワーク処理が完了次第メインスレッドでUIを変更するのが普通だが誤ってバックグラウンド側でUIをいじる処理を書いたら、 iPhone5 iOS6ではス…

UIWebViewで使用しているUIScrollViewを取得して表示コンテンツに対して色々やる方法

iOS5からUIWebView内のUIScrollViewを //webViewはUIWebViewのインスタンス [self.webView scrollView];で取得できるようになった。 しかしUIWebView内のUIScrollViewはreadonlyなので値を変えたりすることは出来ない。 なので自身でUIScrollViewを生成して…

nib but the view outlet was not set.

あるAクラス(A.xibセット)で使用するために新たにA2.xibファイルを生成して、A2.xibファイルのオーナーをAクラスに設定した。 これで1つのクラスから状況に応じて読み込むxibファイルを変更できると思い下記読み込みをすると A *a = [[A alloc] initWithNib…

titleForHeaderInSectionでsectionNameKeyPathで指定したカラム以外をセクションタイトルとして指定する方法

UITableViewのtitleForHeaderInSectionでNSFetchedResultsControllerから対象のテーブルオブジェクト取得 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { //Sessionsテーブルのオブジェクトの取得 _fetche…