hachinoBlog

hachinobuのエンジニアライフ

2013-01-01から1年間の記事一覧

iOS5でaddGestureRecognizerしたViewの上にUIButtonをaddSubViewした場合にボタンを押下してもEventが呼ばれない

題名の通りaddGestureRecognizerしたViewにUIButtonをaddSubviewした際、iOS5系ではUIButtonを押下してもEventが呼ばれずUITapGestureRecognizerにフックされてしまった。 問題が起きるコード #import "ViewController.h" #import "AppDelegate.h" @interfac…

plistから読み込んだデータを簡単にオブジェクトに変換する方法

plistからデータを読み込んでオブジェクト化する時はNSPropertyListSerialization propertyListWithData: options: format: error:を使うと便利。 例えばPerson.plistを作成したとする。 内容は下記のようになっている。 Person.plist コード - (void)viewDi…

Unbalanced calls to begin/end appearance transitionsの解決方法

アプリをビルドした際にコンソールにUnbalanced calls to begin/end appearance transitions...と出力された。 これはviewDidLoadやviewWillAppearで別ViewControllerへの遷移コードを書いていると発生する。 私はズバリ、viewWillAppearで条件に応じて別Vie…

iOS7でUITableViewCellAccessoryTypeを矢印なしのUITableViewCellAccessoryDetailDisclosureButtonにしたい場合

iOS7でUITableViewCellのUITableViewCellAccessoryTypeをUITableViewCellAccessoryDetailDisclosureButtonに設定してビルドしてみるとiOS6の時のようにボタンだけでなく、矢印も一緒に表示されてしまった。 矢印が不要だったのでUITableViewCellAccessoryTyp…

Main.storyboardとは別のstoryboardから特定のViewControllerのインスタンスを生成する方法

今更ながらStoryboardの読み込み方法。 前提としてStoryboardの読み込みたいViewConrollerにて[Show the Identity Inspector]の[Storyboard ID]に一意のIDを振っておく。 読み込み方は //Sub.storyboardの読み込み UIStoryboard *storyboard = [UIStoryboard…

CoreDataのlike句のワイルドカードを検索する方法

CoreDataでlikeを使用して文字列を検索する際にワイルドカードとなるアスタリスク*と?自身が含まれるものを検索したい場合はバックスラッシュでエスケープする必要がある。 //検索対象文字 NSString *keyword = @"*"; 検索対象文字をエスケープしてあげる k…

nilは0だからBOOL判定時とかに使用する場合は注意が必要って話

NSStringクラスのカテゴリを作成し該当の文字列が空かどうか判定するisEmptyメソッドを作った。 - (BOOL)isEmpty { if (self.length > 0u) { return NO; } return YES; } 上記メソッドを使用して空文字である場合と空文字でない場合の処理を下記のように分岐…

iOS7でスワイプによる戻る機能を無効にする方法

iOS7からスワイプすることで戻る機能が標準になりました。 いくつかのアプリではこの機能を無効にしたいと思うものもあると思います。やり方は各ViewControllerで if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecogn…

iOS7でtoolbarもしくはnavigationBarの色が濁る事象

前回の記事(http://d.hatena.ne.jp/hachinobu/20131010/1381364057)に関連するのかもしれないがiOS7のStoryboardでUIViewControllerにUIToolbarを配置してビルドしたらUIToolbarの領域の色が濁ってた。 これの回避方法としてはtranslucentプロパティにNOを設…

iOS7でUIWebViewのスクロール領域がおかしくなる現象

iOS7のStoryboardでUIViewControllerのviewの上にUIWebViewを配置してビルドしてみると、なぜか下にスクロールでき黒い領域が発生した。 バグなのかどうか根本的な原因はよく分からないのだが、解決方法としてはUIViewControllerのviewとUIWebViewの間にview…

OCMockの基本的な使い方

テストケースを書く際にOCMockを利用し始めたので基本的な使い方をメモ。1.テストケース対象クラス内で他のクラスのメソッドを呼び出している結果を書き換える //テスト対象クラス内で呼び出しているOtherクラスのモックを作成 id mock = [OCMockObject mock…

A view can only be associated with at most one view controller at a time!エラー

幾つかの画面(ViewController)で共通のUIActionSheetを使い回したかったので共通のUIActionSheetを管理するシングルトンクラスを生成して、そのシングルトンクラスのUIActionSheetを表示させたいViewControllerでshowFromBarButtonItemしていた。 iPadではBa…

自作クラスのプロパティ変数名一覧を取得する方法

JSONデータを扱う際にJSONデータと同じキーのプロパティ変数を持つ自作クラスを作成してJSONデータをパースして保存することがよくある。 その際に自作クラスのプロパティ変数がJSONデータのキー値となるので、プロパティ変数名の一覧が取れると便利。やり方…

iOS7でNavigationBar領域までViewが食い込んでしまう事象の回避方法

これまでxibファイルで[Top Bar]からNavigationBarを選択して、そのNavigationBarの下にViewを配置していたのだけれども、 iOS7でビルドするとNavigationBar領域に配置したViewが食い込んでしまっていた。コードの場合は下記で対応。 - (void)viewDidLoad { …

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…