★アイフォンアプリの開発XCode今日のエラーの対処、Navigationナビゲーションコントローラーのエラー、 unrecognized selector sent to instance というエラーが多くて対処中、CoreDataによるデータベースはプロジェクトでテンプレートを指定して作成する

Contents

アイフォンアプリの開発で今日のエラー、ナビゲーションコントローラーのエラー、 unrecognized selector sent to instance というエラーが多くて対処中

iPhoneアプリ開発中はさまざまなエラーが発生します。できるだけ、その都度、どうやったのかをメモしています。
そうすることで、すぐにエラーに対処でき、悩まずに済みますし、開発期間を短縮できるし、ストレスも小さくできます。

記憶が薄れそうなので、CoreDataコアデータ、データベースについて記載すると、コアデータを使用したアプリは、プロジェクトで先にテンプレートを指定したほうが開発が楽になります。他のテンプレートを指定したあとで、CoreDataの記載をするとエラーが多発してしまい時間がかかり、結局、コアデータのテンプレートを使用して開発しました。(2013年12月10日追記)

(1)NSMutableArrayの配列が正常に取得できない、範囲外の配列を取得しようとした

プロパティでstrongではなく、weakにしていた。
weakをstrongにして、配列のオブジェクトの値を正常に取得できました。

・NSMutableArrayのエラー、初期化を忘れているとコンパイルエラーがなくても、間違っている。初期化忘れがないかをチェックしましょう。
[[NSMutableArray alloc]init];

(2)intをNSNumberに変換したい

int n=10;
NSNumber *num=[NSNumber numberWithInt:n];

NSNumberをintとして扱うときは
n=[num intValue];
とします。

(3)ナビゲーションコントローラーのエラー

‘NSInvalidArgumentException’, reason: ‘-[ResultViewController viewControllers]: unrecognized selector sent to instance 0x11a5e950’

ナビゲーションコントローラーがないのに、ナビゲーションコントーラー用のコードを書いていました。
ナビ−ゲーションコントローラーがあるときの値を渡すとき

			UINavigationController *navCon=segue.destinationViewController;
            ResultViewController *rv=[navCon.viewControllers objectAtIndex:0];
            rv.youSelectNumber=[NSNumber numberWithInt:iselectAnswer];

            ResultViewController *rv=segue.destinationViewController;
             rv.youSelectNumber=[NSNumber numberWithInt:iselectAnswer];

ナビゲーションコントローラーがないときはシンプルです。

(4)admobが表示されない[GADObjectPrivate changeState:]: unrecognized selector sent to instance

というエラーは、ビルドセッティングを入れれよいだけでした。
以前作業したときはあったような気がしましたが、もしかすると、X-CODEのバージョンアップで解除されてしまった?

BuildSetting->Linking->Other Linker Flags
-ObjC
をRelease and Debugに入れました。
とりあえず、OKですが、
実はテーブルビューでスクロールをすると広告がセル一緒に移動してしまうのです。
ということはテーブルビューではAdmob広告は使えないか、他のテーブルで設定しなければなりません。

(5)Core Data、エンティティエラー、CoreDataによるデータベースはプロジェクトで指定して作成する

reason: ‘+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name

シングルビューでプロジェクトを作成し、後で、coreDataを追加したものです。
エンティティネームが間違っているかと思いましたが、正しい。
後入れ、CoreDataは結構面倒ですね。だからみんなさきに指定して作るんですね。
とりあえず、さきにEmptyプロジェクトにして作り直してみます。

>未解決ですが、解決としては、Emptyプロジェクトにして作り直したほうが早い

(5-2)再現性あり。

Emptyで作り直して、問題なかったのですが、また再現しました。
*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’,
reason: ‘+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name

まず、アプリを削除して、クリーンを実行しました。
その後、次の5−3のエラーが発生

(5−3)

reason: ‘*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array’
データをリセットして、初期状態になったので、
配列数が0になったと思います。
配列数が0のときに、配列の値を取得しないようにしました。
またエラーが発生したので、よくみたら
AppDelegateしたプロパティを
self.appとしました。
グローバル変数としたものを
@property(strong,nonatomic)NSNumber *nowNumber;//NSInteger
をweakにしたら、エラーが表示されず。
@property(weak,nonatomic)NSNumber *nowNumber;//NSInteger
しかし、エラーにならずとも、値がリセットされていました。値なしです。
そこで、retainにしてみました。
するとOKでした。
どうやら、AppDelegateのグローバル変数はretainが良さそうです。

そのほか、managedObjectContextが作成されていないみたいだったので、AppDelegate.h,mに設定しました。しかし、これでもだめ。
やはり、AppDelegateしたプロパティを
self.appとしました。OKです。

(6) nil エラー

reason: ‘Cannot create an NSPersistentStoreCoordinator with a nil model’

現在のビュークラスから次のビュークラスへ移動のときに、次のビュークラスでエラーがあって
呼び込めていないことがありました。そのため、次のクラスの怪しい箇所をコメントにしました。

(7)reason: ‘Pushing a navigation controller is not supported’

pushがだめならとmodalに変更しました。

なお、このnot supportedの場合、ナビコントローラーを交互に入れていたので(必ず一組で作成)、その1組のうちのナビコントローラーを削除して、組み直すとpushでも可能になります。
ここら辺がやってみないとわからないトライアンドエラーです。

(7−2)

Property implementation must have its declaration in interface ‘ResultViewController’
.mで、@synthesizeのところで改行を入れたから、OKでした。なぜ?

(8)Core Dataエラー

Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 “The operation couldn’t be completed. (Cocoa error 134100.)

新しく、CoreDataにエンティティを追加したり、アトリビュートを追加したときに実行するとエラーが起きます。
1.クリーンを実行して
2.この場合は、シミュレータのアプリを削除すればよいみたいです。
なお登録したデータが消えるかもしれないので、すでに登録して必要なデータは、保持した方がよいでしょう。テスト用でも面倒だったりするので。

(9)タブバーでのワーニングログ、

動作について今のところ支障がない。
Unknown class AAAViewCotroller in Interface Builder file.
タブバーを使用して、画面を切り替えるとログが表示、実行に問題はないけど、ちょっとログがでてしまうのが気になるところ。
>未解決、重要性が低い

(9)admobエラー、リンカーエラー

reason: ‘-[GADObjectPrivate changeState:]:
>X-CODEの環境設定で、Other Linker Flagsに -ObjCを追加

(10)

reason: ‘Unacceptable type of value for attribute: property = “number”; desired type = NSNumber; given type = __NSCFString; value = mas**.’

>未解決

(11)map の検索入力で半角英を入力したときにエラー

-[MapViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xac6d150
*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[MapViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xac6d150’

>- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
を追加しました。これは、サーチした後にテーブルビューが表示されるものです。
書籍には記載されていないもので、記載ミスでしょうか。

(12)画面遷移でのエラー

-[NSURLResponse intValue]: unrecognized selector sent to instance 0xac65570
*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[NSURLResponse intValue]: unrecognized selector sent to instance 0xac65570’

ボタンをタップして次の画面に移動しないときがあって、必ず発生するエラーではない。3回に1回程度発生するという変なエラー。
NSURLResponse intValueを設定した覚えはない。ということは、それを使ってるメソッドか何かがどこかにあって、それが使っていると言うことですかね?

このように、必ず発生しないときは、発生手順をメモしながら原因を究明していきます。
環境は、ストーリーボード、coreDataを使用している。

>プロパティ変数のretainで解決しました。weakにして、retainでエラーがなくなりました。(5−3)での記載が詳細になります。

(13)NSDateはnilで判定

NSDate関連のエラーで、NSDateがnilでした。アウトプットはnullとでますが、
NSDate *date;
if(date==nil)
で判定します。

iPad 、アイフォンのストーリボードとiPadのストーリーボードの共存

アイフォンとiPadで同じパーツを使用するときで、同じクラスを使用するとき、ヘッダーファイルのプロパティをiPadのストーリーボードのパーツに紐付けします。
これだけで良いのです。
新しく、iPadのストーリーボードからヘッダーファイルへ紐付けする必要はありません。
つまり、すでに既存のヘッダーファイルのプロパティを利用できるのです。
これは便利です。アイフォンアプリとiPadアプリの2つのアプリを作成時間は意外にも時間がかからないのかもしれません。

(1)reason: ‘-[__NSCFString substringWithRange:]: Range or index out of bounds’

範囲外の値を入力していたので、範囲を小さくしました。

(2)reason:‘[ setValue:forUndefinedKey:]: this class is not key value coding-compliant

reason: ‘[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key imageViewSmall_iPad.’

アイフォンのストーリーボードからiPadのストーリーボードにコピペして、それを共通のビュークラスに紐付けしました。
そして、この紐付けが不要なのに、そのままにしていました。
shows connections inspectorで、びっくりマークになっている箇所を削除しましょう。
アイフォンと同じパーツを使うのであれば、ヘッダーファイルからストーリーボードのiPadのパーツへ紐づければ良いのです。ヘッダーファイルの該当するプロパティの左にある二重丸からiPadのストーリーボードのパーツへドラッグします。
この場合は、ヘッダーファイルからストーリーボードへつなぎます。いつものストーリーボードからヘッダーファイルへの向きと異なります。
たったこれだけです。iPadも意外と楽ちんです。

開発したアプリ、弁理士短答試験過去問題記録ノートの紹介

アプリ紹介リンク

このようにして開発したアプリが弁理士短答試験過去問題記録ノートです。
iOS7 iPhoneアプリ(4作目)申請からリリース状況のまとめ 2013年9月、弁理士短答試験過去問題記録ノート
アドモブの広告をつけています。

他のフレームワークについて

関連リンク

Unityでの開発状況2014年Unity4.5.5

関連記事

「スポンサーリンク」


ツイートツイート
カテゴリー: iPhoneアイフォンアプリ開発 タグ: , , , , , パーマリンク