どのボタンが長押しされたのかを検出


複数のボタンにUILongPressGestureRecognizerを設定していて、どのボタンが長押しされたのかを検出したかったのだがやり方が分かったのでメモ。
iphone – How to get button.tag via longPressGestureRecognizer? – Stack Overflow

UIGestureRecognizerにはviewプロパティがあって、そのプロパティにはUIGestureRecognizerを割り当てたviewが入っているらしい。
なので、ボタンのtagに適切に値を設定しておけばUIGestureRecognizer.view.tagからtagの値を知ることができるとのこと。
勉強になった。

先人は6年も前に解決していたのか。。。


duplicate symbol in libNendAd.a


リンクエラー発生

なかなか時間が取れない中で細々とiOSアプリの開発を続けています。
そんな中でcocos2d-xで開発中のアプリに広告を入れようとしたときに遭遇した問題。

環境:
cocos2d-x 3.7.1
NendSDK 2.7.4
xcode 6.2

アプリがある程度形になってきたところで、広告を入れてみようとhttps://github.com/fan-ADNのcocos2d-xのマニュアルを読みながら設定、ビルド。
すると

duplicate symbol _llvm.cmdline in:
 /ファイルパス/proj.ios_mac/ios/NendAd/libNendAd.a(NADInterstitial.o)
 /ファイルパス/proj.ios_mac/ios/NendAd/libNendAd.a(NADInformationView.o)
duplicate symbol _llvm.embedded.module in:
 /ファイルパス/proj.ios_mac/ios/NendAd/libNendAd.a(NADInterstitial.o)
 /ファイルパス/proj.ios_mac/ios/NendAd/libNendAd.a(NADInformationView.o)

このようなduplicate symbolエラーが大量に発生してビルドできません。
続きを読む


iOS 7.1, iOS 8.1 simulatorで漢字変換できない


表題の通りなのですが、私の環境でiOS7.1とiOS8.1のシミュレータで漢字変換できなくなってしまったのです。

いつからできないのか定かではないのですが、自分のアプリのtextfieldでも変換できないばかりか、最初からインストールされているカレンダーなどのアプリでも漢字変換できません。

iOS Simulator Screen Shot
通常であればキーボードの上に漢字変換の候補が出るはずなのですが、これが出ない。
さらに「確定」ボタンを押しても確定してくれません。

以下のようにシミュレータのデータをリセットしても再現するので困惑しています。
reset -> settings -> general -> Language & Region -> iPhone Language -> 日本語 -> Done -> Change to Japanese
カレンダー -> 右上の+ -> 漢字変換できない!!

iOS8.2のシミュレータでは正常に変換できているのですが。。。

使用している環境は、
Xcode 6.2 (6C131e)
iOS Simulator Version 8.2(553.8)

iPhone 5s ios8.2(12D508) –> iOS8.2は正常に変換できます
iPhone 5s ios8.1(12B411) –> これは漢字変換できない
iPhone 5s iOS7.1(11D167) –> こちらも同様に漢字変換できない

方々検索しているのですが、同じ症状で困っている方を見つけることができなくて、ひょっとして私の環境だけ変になってしまったのでしょうか。
iOS8.2以外はテストせずにリリースするか、それともiOS8.2だけをターゲットにしてアプリ作るか、、、うーーん。

— 追記 —
iOS8.1のシミュレータには、言語関連のバグがあるらしい。
このあたりのバグが関係しているのかなぁ。
iOS8.2の方で修正してあるそうなのでそっちでテストしろってことなんかな。
objective c – Keyboard Extension Not Working with iOS 8.1 Simulator – Stack Overflow
iphone – NSLocale preferredLanguages objectAtIndex:0 always return “en” – Stack Overflow


xcode6でios6対応


xcodeのバージョンを上げてからもしばらく気付かなかったのですが、昔作ったアプリを保守しているときにふと気付きました。

xcode6からiOS6のシミューレーターを起動できない!!
いやほんと今更なんでしょうが。
xcode6からiOS6対応止めちゃったんですかね。iOS6は、もうほとんど使っている人がいないってことなんだろうか。

きまぐれ備忘録: [Xcode6] iOS6向けのビルド
こちらの方の記事なんかを読ませて頂くと、iOS6向けにアプリを作ることができなくなったわけではないようですが、ちょっと面倒。
さらにiOS6のシミュレーターを起動するのも面倒な感じです。

きっとAppleがiOS6はサポートしないでもそれほど影響はないと判断したんでしょう。
というわけで、今後アプリをアップデートするときはiOS6は対応しないことにしようと思います。


numberOfRowsInSectionを超える行が表示される


UITableViewを使うときはnumberOfRowsInSectionを設定しないといけないですが、表示したい行数が少ない場合、ここで設定した行数を超えて空白行が表示されます。
これを表示させないようにするには、
frameサイズ0のフッターを付ければいいらしい。
iphone – UITableView showing more rows than specified in numberOfRowsInSection: – Stack Overflow

[tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]]

iOS simulatorでキーボードが表示されなくなった


xcode 6.0.1 にアップデートしてしばらく開発を続けていたところ、iphoneシミュレータでtextViewをクリックしたときに、キーボードが表示されなくなっていることに気付きました。
キーボード関連のコードは最近書き換えていなかったし、さらにiPad2のシミュレータの方では正常にキーボードが表示されるという状態でますます意味が分かりません。

そこで検索してみると以下のドンピシャの答えが見つかりました。
iphone – Swift Xcode 6: keyboard not showing up in ios simulator – Stack Overflow
要約すると

Q. シミュレータでUITextViewをクリックしてもキーボードが表示されなくなりました。昔は動いていたのに。。。
A. 解決法は以下
1. iOS Simulator -> Hardware -> Keyboard
2. [Connect Hardware Keyboard]のチェックをはずします

ishot141006-2

こんな設定があったんだなぁ。


google maps SDK for iOS 1.8.1を使ってみる


google mapのSDKの1.8.1が出ているらしい。3ヶ月も前だけども。
1.8.1を使ってみる前に、今まで使っていたのは1.6.2だったので、それ以降のバージョンのrelease noteを読んでみた。

Google Maps SDK for iOS — Google Developers
結構変わってるっぽい
以下、ざっと日本語にしてみたもの。間違っていたらごめんなさい。Version1.7.1のところなんかは全然意味が分からないです。。。
詳細はオリジナルを見て下さい。
続きを読む


iOS用 google mapでマーカーをタップせずにinfo windowsを出す


地図系アプリを作成中。
マーカーを好きな位置に出すことはできますが、info windowは出せないのかな?と調べたらあっさり解決法が見つかりました。

How to show a Info window in iOS Google maps without tapping on Marker? – Stack Overflow

GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = coordinate;
marker.title = @”Location selected”;
marker.snippet = @”Testing”;
marker.map = mapView_;

//Show info window on map
[mapView_ setSelectedMarker:marker];

こんな風に、 setSelectedMarker でマーカーを選択してやればinfo windowが開きます。
当然かもしれませんが、複数のinfo windowを同時に出すことはできないようです。

ウインドウを複数出したいようなときは、UIViewで自作するしかないですかね。


Xcodeでsub projectを追加するときの注意


SQLCipherというものを利用して、SQLiteを使ってデータを保存し、そのデータを暗号化しようとしている。

まず、こちらのサイトを参考にしながらサンプルアプリを作った。
chrooot: SQLCipherを使用してデータベースを暗号化する。(iOS)
乙寺備忘録 [iPhone]sqlcipherを利用する。(その2)

ここまでは上手くいっていたのだが、次に作成中のアプリにこの機能を組み込もうとしたときにトラブったのでメモ。

SQLCipherとopenSSLのライブラリを自分でbuildしなければならないので、自分のプロジェクトにSQLCipherとopenSSLのプロジェクトを組み込まなければならない。
そのために「Add Files to “自分のプロジェクト”」でサブプロジェクトとして登録するのだが、Addする際に「Destination: Copy items into destination group’s folder (if needed)」のチェックとしてもしなくても、コピーされなくて参照になるようだ。

私の場合、SQLCipherとopenSSLをサブプロジェクトに登録しても、なにやらプロジェクトとして認識されていないような状態になった。
サブプロジェクトのsqlcipher.xcodeprojをクリックしてもプロジェクトの情報が表示されないのだ。
それであれこれ操作を試していると、どうやらテスト用のサンプルアプリの方でSQLCipherのプロジェクトファイルを開いたままになっているので、他のアプリで開けない状態であることが分かった。両方から参照されている状態になっているらしい。
そこでサンプルアプリの方を閉じると正常に認識された。

結論
何かをサブプロジェクトとして登録するときには、そのプロジェクトファイルを他のアプリで開いていないことを確認しよう。


Localizable.stringsに全角空白を入れないよう注意


Localizable.strings (japanese)を編集していて、次のようなエラーに遭遇した。

Localizable.strings:0: error: read failed: The data couldn’t be read because it has been corrupted.

以前も見たことのあるエラーで、そのときは最後のセミコロンを忘れていたり、ダブルクオーテーションを忘れていた。
今回も同様の間違いだろうと一行ずつチェックしていったが見当たらない。

そこでファイルの後半半分を消してコンパイルしなおし、エラーがなければ後半4分の1を消してコンパイルというようなことを繰り返しエラーの行を特定した。
その行のエラーの原因は「 = の右側に全角空白がある」ことだった。

これはパッと見では分からないので中々発見し辛いエラーだった。
せめて行番号だけでも教えてくれればはかどるのに。