iOSの最近のブログ記事




- (void)viewDidAppear:(BOOL)animated
{
    timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(someSelector) userInfo:nil repeats:YES] ;
}


といった感じでタイマーをセットしたが、viewが表示されても一向に someSelector が呼ばれない。

viewController の呼び出し場所によっては、同じコードでも呼ばれるときがある。

調べた結果以下のようにメインスレッドでタイマーをセットすると呼ばれるようになりました。


- (void)startTimer
{
    timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(someSelector) userInfo:nil repeats:YES] ;
}

- (void)viewDidAppear:(BOOL)animated
{
        [self performSelectorOnMainThread:@selector(startTimer) withObject:nil waitUntilDone:NO] ;
}




viewWillAppear内で
[self.tabBarController.tabBar setHidden:YES] ;
でタブバーの表示を隠したのだが、タブがあった位置にあるViewのタップが検知されない。

[someViewController setHidesBottomBarWhenPushed:YES] ;
[self.navigationController pushViewController:someViewController animated:YES] ;
で呼び出される前にsetHidesBottomBarWhenPushedすることで解決。

なんでだろ。


iOSアプリ開発で Facebook SDK を使ってログイン処理を書いていたら

App not setup: The developers of this app have not set up this app properly for Facebook Login.

というエラーでログインできなかった。

ログイン処理のコードは別のアプリでも使っているものなので問題なさそう。

Facebook developer ページのアプリの設定で
Status & Review の Do you want to make this app and all its live features available to the general public?
の問いを YES にするとログインできるようになりました。

public にしなくても本人のアカウントではログインできるので、他の人がテストするまで気づきませんでした。




iOS 5.x でアプリ起動時に
dyld_fatal_error
dyldbootstrap::start .....
エラーとなる。

悩んだ結果、追加したFrameworkがiOS5に無いためのようだ。
Social
AdSupport
Accounts
の各フレームワークをOptional にしたら無事起動しました。



UITableView の セルの背景色を指定しようと思い、単純に

[someCell setBackgroundColor:[UIColor redColor]] ;

のようなことをしてみたが、一向に背景色が変わる気配が無い。。


調べてみたところ、UITableViewCell の contentView に対して setBackgroundColor を発行しないといけないことが判明。

[someCell.contentView setBackgroundColor:[UIColor redColor]] ;

で無事に背景色が設定されました。




これ、何度かやっているので備忘録。

NSMutableArray に addObject でオブジェクトを追加した後、objectAt でオブジェクトを取得すると nil が返ってくる。

addObject する前に NSLog でログを出しても、ちゃんと出力されるので、追加するオブジェクトは nil ではない。

でも、objectAt で nil が返ってくる。

原因は alloc していませんでした。。。

addObject する前に [[NSMutableArray alloc] init] が必要でした。基本ですね。。

NSMutableArray 自身は nil の場合でも addObject がランタイムエラーにならないので気づきにくい。

意外と軽くはまります。

このバグは忘れたころにやってきます。



クラスに独自の拡張機能をつけることができる、objective-c のカテゴリメドッソが便利そうなので使ってみた。

ヘッダと実装ファイルは NSString+URLEncode.h などと +カテゴリ名 をつけるようだ。

実装が終わり、早速呼び出して使ってみたところ、ランタイムで
unrecognized selector
というエラーになり実行されない。

メソッド名などが間違っていないか確認したが、ヘッダも実装も呼び出し側も同じメソッド名で間違いない。

悩んだ結果、原因は .m ファイルがコンパイル対象になっていないということでした。

Xcode でファイルを作っただけでは、コンパイルしてくれないらしい。。

XCode の [Build Phases] - [Compile sources] で作成した .m ファイルをコンパイル対象に追加して実行したら無事にメソッドが呼ばれました。



In-App Purchase のテストをするときは、設定のAppStore でアカウントのサインアウトをしてから、テスト対象のアプリを起動し、In-App Purchase が発生する場所を動作させるとログインダイアログが出てきて課金テストが出来る。

でも、シミュレータの場合だと設定にAppStoreの項目がないのでサインアウトできない。
サインアウトできないと、アカウントが変更できないので、別のアカウントでテストができない。

調べたところ、以下の方法でログアウトが可能でした。

- シミュレータを終了させる。

- ホームディレクトリ以下の
Library/Application Support/iPhone Simulator/6.1/Library/com.apple.itunesstored
にあるファイルを削除する

- シミュレータを起動して、テスト対象のアプリを起動する

以上で無事ログアウトされていました。

公式にはシミュレータのリセットをしたほうがよいのかもしれません。
その場合は、アカウント情報以外のものもリセットされてしまうと思います。



iOSアプリ開発時にはARCという機能をONにしている。

ARCはインスタンスを管理して、不要になったら自動的に解放してくれる便利な機能です。

これを使うことによって release などの明示的な解放処理の記述を書かなくてもよくなります。逆に書くとエラーになります。

しかし、開発をしていると、他のプロジェクトのソースを参考にしたり取り入れたりすることも多いので、その際はこのARCが問題になります。

参考にするソースがARCに非対応の場合、release などの記述がコード中にあるので、そのまま取り込むと
not available in automatic reference counting mode
というようなエラーが発生します。

このエラーを無くすために ARC 非対応の記述を一つ一つ直すのは大変なので、以下の手順で特定のソースだけ ARC をOFFにしてコンパイルします。

[Build Phases] - [Compile Sources] で該当のソースファイルを選択してEnter

表示されたエディットボックスに -fno-objc-arc を記述してEnter

この設定で、指定されたファイルは ARC OFF でコンパイルされます。





iOS のシミュレータでアニメーションをゆっくりにして確認したいときは、キーボードのSHIFTキーを連続で3回押します。

すると、XCode のアウトプットに Simulator slow-motion animations are now on と表示され、以降のアニメーションがスローになります。

微妙な動きを確認するとき等に便利です。

スローモードを解除するときも、同じくSHIFTキー3回連続打で解除できます。


このアーカイブについて

このページには、過去に書かれたブログ記事のうちiOSカテゴリに属しているものが含まれています。

前のカテゴリはandroidです。

次のカテゴリはXperia arcです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.13-ja