XcodeでiOSデバイスを選択できないかNSInvalidUnarchiveOperationExceptionが発生する

プロジェクトのターゲットOSが最新のときは、旧OSを使用したiOSデバイスを対象にしたビルドや実行はできません。

デバイスで実行したいときは、プロジェクトのターゲットOSを下げる必要があります。
xcode1

また、デバイスで実行すると以下のエラーが発生することがあります。

Terminating app due to uncaught exception ‘NSInvalidUnarchiveOperationException’, reason: ‘Could not instantiate class named NSLayoutConstraint’

これは、Storyboardの設定が旧OSでサポートされていないのが原因です。
xcode2

具体的には、「Use Autolayout」のチェックを外す必要があります。

xcode4

これで実行できるはず。

UIPickerViewのselectRowが動かないとき

例えば、ピッカーを2つ設置したとします。

一方のピッカーの選択によって、他方のピッカーの値をselectRow:inComponentによって変えるとき、
その他方のピッカーが動かないことがありました。

以下のようなコードです。

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    /* ... */

    // 選択させる
    [pickerView selectRow:rowIndex inComponent:0 animated:YES];
    // 選択後の動作をさせる
    [self pickerView:pickerView didSelectRow:rowIndex inComponent:0];
}

ネットで情報がうまく得られなかったため、以下のようにperformSelectorを使ったところ、解決しました。

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    /* ... */
    _index = rowIndex;
    [self performSelector:@selector(selectPicker2:) withObject:self afterDelay:0.01];
}
- (void)selectPicker2:(id)sender
{
    [_picker2 selectRow:_index inComponent:0 animated:YES];
    [self pickerView:_picker2 didSelectRow:_index inComponent:0];
}

iOSシミュレータで音が鳴らない/ファイルが読み込めないことがある

いつも通りビルドしたつもりなのに、突然下記の症状が出ることがあります。

  • 音声が再生されない
  • 画像が表示されない
  • ファイルが読み込めない

特に音については、CocosDenshion(SimpleAudioEngine)の使用方法や
caf/mp3/wav/aifファイルの作成方法、
afconvertコマンドでの引数指定を間違えたのか、と思いがちです。

トリガーとなるのは、直前のクリーンとリソースファイルの登録し直しです。

原因は、
Project Navigator のプロジェクト→TARGETS→Build Phases→Copy Bundle Resources
に該当のリソースファイルが登録されていないからです。
しかしここに追加しても根本的な解決になりません。

.png以外のリソースファイルをXcodeウィンドウにドラッグアンドドロップすると、
直後の「Choose options for adding these files」ダイアログにて
Add to targetsオプションでターゲットのチェックが外れています。
(.pngファイルだと、ターゲットにデフォルトでチェックが付きます)

よって、リソースファイルが更新されてもコピーされずに以前のデータが使われていたが、
クリーンしたことでそのデータも消えてしまった、というわけです。

ドラッグアンドドロップ後のダイアログによく注意し、
ターゲットにチェックを付けるようにしましょう。

UITableViewをコードで追加しスクロールバーを点滅させる

InterfaceBuilderを使わずにUITableViewを作成したとき、

UITableView* tableView = [[UITableView alloc] init];
[_controller.view addSubview:tableView];
[tableView flashScrollIndicators];
/* or */
[tableView performSelector:@selector(flashScrollIndicators)];

としてもスクロールバーが点滅しないことがあります。
以下のように、performSelector:withObject:afterDelay: を使うと点滅させることができます。

UITableView* tableView = [[UITableView alloc] init];
...
[tableView performSelector:@selector(flashScrollIndicators) withObject:self afterDelay:0.0];

Xcodeをアップデートするとビルドエラーが発生する

Xcodeをアップデートした後の最初のビルド時に、
以下のようなエラーが発生することがあります。


error: PCH file built from a different branch ((clang-425.0.27)) than the compiler ((clang-425.0.28))

この時は、一旦クリーンしてビルドし直すとエラーが解消されます。
Product → Clean

なお、シミュレータ、実機のそれぞれでクリーンが必要になります。

アプリの画面を横向きに固定する

Xcodeのプロジェクト設定(TARGETS設定)の
iPhone / iPod Deployment Info → Supported Interface Orientations
にて
「Landscape Left」 or 「Landscape Right」
を選択しても横画面にならないときは、
ViewControllerのサブクラスにて下記のメソッドを追加します。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    BOOL ret = NO;
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) ret = YES;
    return ret;
}

このtoInterfaceOrientation には、向きが入ってきますので、許可する向きの値のときに
YESを返すようにします。