AFNetworking2.0で通信が成功しない

このあいだあったこと。
これまでNSURLConnectionで直接書いていた部分をAFNetworking2.1にしたが

Request failed: unacceptable content-type: text/html

とか言われて通信がどうしても成功しない。


◆ Request failed: unacceptable content-type: text/html using AFNetworking 2.0
http://stackoverflow.com/questions/19114623/request-failed-unacceptable-content-type-text-html-using-afnetworking-2-0


こちらで解決方法が紹介されていました。
どうもresponseのserializerでtext/htmlを許可してやればよさそうです。
例えば以下のような記述になります。

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"text/html", nil]];


私の環境では、これで問題が解消しました。

GHUnitを導入したが、クラスのテストが動かない

なんか、以下のようなエラーが出て動かない。

Undefined symbols for architecture 


まぁ、その通りundefinedだったわけですけど。
今回は通信クラスのテストがしたかったんですが、
後からテスト用のターゲットを追加したので対象クラスがビルドの対象になっていなかった。


そのため、テストを実施したいソースファイルを選択してtargetに追加してやればOK。

Storyboardの多言語対応を行う&ハマったこと

普通のテキストなんかは NSLocalizedString(@"text",@"comment") で
書くように癖を付けとけば、基本的に多言語対応するときにもそんなに困りません。


iOS6以降で、storyboardを使って開発を行っていると
storyboardの要素に付いても多言語対応するのが簡単になりました。


基本的にはこちらのブログを参照すると分かると思います。


◆ 国際化したStoryboardを一つにまとめる / ninjinkun's diary
http://ninjinkun.hatenablog.com/entry/2013/01/14/192206


これで後は追加した.stringsファイルを編集すれば
言語ごとにstoryboardを作らなくて良くなるので、ヒャッハーって言う
感じではありますが色々とハマったことがありましたので備忘録。


“Could not find a storyboard named .."とか言われる

Baseを追加してから、[UIStoryboard storyboardWithName: bundle:]で読み出そうとすると
なんか見つからないとか言ってきました。
Cleanしても無駄だし、なんだこりゃって感じで。


私の環境では、一応こちらに挙げられていた解決方法で直りました。
http://stackoverflow.com/questions/15848165/base-internationalization-and-could-not-find-a-storyboard-named
Xcodeを完全に終了してから再起動して、Cleanして再ビルド。



変更が反映されない

色んな箇所を英語化したのに、反映されませんでした。
日本語のLocalizableを削除して、英語だけにしたのに反映されませんでした。


なんかこれキャッシュが効いてるんじゃないかってことで
アプリを一回削除してから再インストールしたら反映されました。
キャッシュ強過ぎ。



特定のLabel、Buttonだけ言語が反映されない

削除して再インストールなんかをしても、特定のコントロールだけ
変更が全然反映されませんでした。
どうやら、たとえ継承していたとしてもCustom Classだと適用されないぽい。ひどい。


◆ Localization of custom class set in storyboard doesn't work
http://stackoverflow.com/questions/19397896/localization-of-custom-class-set-in-storyboard-doesnt-work


仕方がないので、こちらで挙げられている形で修正をかけていくことにしました。

myLabel.text = NSLocalizedStringFromTable(@"ObjectID.text", @"storyboardName", nil)

各Storyboard.stringsの要素をNSLocalizedStringFromTableを使って参照して適用。
取りあえず手元で確認した限りでは、これでOKでした。


ただ、存在しない言語の場合に"ObjectID.text"という名前で表示されてしまう問題も発生します。
私は今回、デフォルト言語を英語にして日本語の場合だけ変えるって形にしたので
事前に言語設定の判定関数を呼び出して日本語の場合だけこの処理を通るようにしています。


また、多言語対応でハマったことがあったらここに追記しようかと思います。

CocoaPodsのアップデートができない

【追記 : 2014-02-03】

[!] Pod::Executable pull

とか言われて、pod installができなくなりました。
どうやら公式にアナウンスがあって、cocoapodsのリポジトリがぶっこわれたらしい。


◆ Repairing Our Broken Specs Repository
http://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository/


修正方法としては、以下の2つのコマンドを実行して再セットアップすること。

$ pod repo remove master
$ pod setup


同じようなトピックなので、まとめておきます。

      • -

なんだかCocoaPodsで pod update とか pod install とか入力してるんだけど
変なエラーが出てアップデートに失敗しまくり。
直近で必要じゃなかったから放置しまくってたけどいい加減アップデートの
必要があったので色々試してみたが時間かかった。

こんな感じのエラー食らう。

[!] Oh no, an error occurred.

1. gemをアップデートする

コマンドラインから

$ sudo gem update --system


2. cocoaPodsをアップデートする

$ sudo gem update cocoapods


3. エラーが出る

まぁ、普通の環境でインストールしてる人なんかは
2. までで普通にインストールできるはずですよね。
XcodeのCommandLineToolsもインストール済みなはずだし。


インストール済みなのに、以下のようなエラーを食らいました。

Updating cocoapods
Building native extensions.  This could take a while...
ERROR:  Error installing cocoapods:
	ERROR: Failed to build gem native extension.


commandLineToolsをインストールし直すって
手段も紹介されてますが、私の場合はこんな感じで直しました。
http://qiita.com/k_kinukawa/items/eb85b634d678f2cd7cc8



Xcodeの設定(Preferences)のLocationsにある
「Command Line Tools」の項目をチェックすると、黄色い△マークが出ていて
「どのXcodeのCommand Line Toolsを利用するか」選択する状態になってました。


この環境、Xcode4.2.1、4.6.3、5.0のCommandLineToolsが入ってて……。
ここを選択し直したところ、普通に

$ sudo gem update cocoapods

で更新できるようになりました。

iOS7betaのipswがインストールできない

なんだか、「this device isn't eligible for the requested build」とか言われたり
「エラー3000」とか言われて失敗しまくり。


iOS5へのアップデート…ちぃと苦労しますた( ̄  ̄;)
http://sorairono.blog10.fc2.com/blog-entry-381.html

iOSアップデート中に"This device isn't eligible for the requested build"エラーが出る場合の対処
http://d.hatena.ne.jp/shu223/20110601/1307559462


こういったページ見ても、そもそもそんなアプリ使ってないよって言う私には
hostsにそんな記述追加されてなくて、それでもやってみたけどダメだったんですが
他のパソコンでiTunesからインストールしたら普通に入りました。どういうこっちゃ。
私の持ってるiPod touchとかには普通にインストールできたんですけどね。


そんなわけで、どうしても分からなかったら人のパソコンにAirDropとかで
ipswを送ってインストール試してみるのもいいかもしれません。

UITableViewCellでimageViewに設定が反映されない

よくやらかすので、覚え書き。

UITableViewCellを継承したクラスで@propertyとしてUIImageViewを追加するとき、
よく使う名前として「imageView」とか書いてたりすると発生します。


原因は、単純にUITableViewCellには既に「imageView」が
デフォルトの変数として定義されているため。


そのため、InterfaceBuilderやstoryboardから
contentModeを変えたり、clipsToBoundsを変えたり、
autolayoutでレイアウトいじったりしても思い通りに反映されません。


大人しく、例えば「iconImageView」などの名前にして定義しなおすのが吉。

Objective-Cでプライベートメソッドを書く

今更なに言ってるの? 感のあるテーマですが
現在関わっているプロジェクトに入るまで知らなかったので、同じように
知らなくて何でもかんでも@property使うと外から見えちゃうのが嫌だなと思ってる人向けエントリ。


方法としては、.mファイルの方にも@interfaceを書くっていうことだけ。
例えば以下のような形。

SampleView.h

@interface SampleView : UIView

@end
SampleView.m

@interface SampleView()

@end

@implementation SampleView

@end


このSampleView.m側の@interfaceに対してプロパティの宣言をしてやれば
全てプライベートメソッドとなるため、外部から見えることは無い。
ちなみに、@propertyを宣言する場合 () 内には何も記述してはいけない。