1

コード行はiOSSimulator6.0で正常に機能しますが、iOS6を実行しているiPhoneで実行しようとすると、クラッシュします。

[menuView addSubview:mvc.view];

なぜこれが起こっているのですか、どうすれば修正できますか?

これは、コードのより完全なバージョンです。

SDMenuViewController *mvc = [[SDMenuViewController alloc] init];
[menuView addSubview:mvc.view];

そして、これはそれがクラッシュしているものです:

2012-10-08 21:32:32.423 CrunchCalculator1-2[21019:907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/EDD23933-CE20-4AFD-A2B1-CDD56AD658E8/CrunchCalculator1-2.app> (loaded)' with name 'SDNestedTableView''
*** First throw call stack:
(0x39cd03e7 0x35ece963 0x39cd0307 0x39ee0fd1 0x39ee05ff 0x39dd9031 0x39e0786d 0x39d63419 0xb20d9 0x39d63541 0x39da3d29 0x39d9fac5 0x39de1199 0xb17c5 0x39da4a71 0x39da45f5 0x39d9c803 0x39d44ce7 0x39d44775 0x39d441b7 0x31e145f7 0x31e14227 0x39ca53e7 0x39ca538b 0x39ca420f 0x39c1723d 0x39c170c9 0x39d9b43d 0x39d98289 0xb1523 0x3792fb20)
libc++abi.dylib: terminate called throwing an exception

ありがとう!

4

3 に答える 3

5

シミュレーターでどのように機能するかはよくわかりません(私が試してみたところ、元の質問にリストされているクラッシュが発生しました)。とにかく、あなたは以下の項目を見ることによってそれを修正することができます:

  • 主な問題は、NIBがバンドルに含まれていなかったことです。プロジェクトターゲットの「バンドルリソースのコピー」に追加します。例:

バンドルリソースのコピー

  • 「バンドルリソースのコピー」を表示しているときに、、、を含めSDSubCell.xibSDGroupCell.xibそれらのPNGファイルもすべて追加する必要があります。

  • 余談ですが、クラッシュの原因にはならないようですが、SDNestedTableViewNIBの「ファイル所有者」基本クラスは、このプロジェクトのどこにも存在しないクラスを指します。それは良いことではありません。SDMenuViewControllerとにかく、おそらくそれをまたはに変更したいと思うでしょうSDNestedTableViewController

ファイルの所有者基本クラスを設定する


クラッシュとは少し関係ありませんが、プロジェクトを見ると、心配な構造があります。

SDMenuViewController *mvc = [[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil];
[menuView addSubview:mvc.view];

コントローラを作成し、そのビューを取得し、ビューコントローラをスコープから外して解放するか(ARCを使用している場合)、リークします(ARCを使用していない場合)。

addSubview元の質問から、新しいビューに移行する方法として行っているのか(これは本当に悪い習慣です)、ビューコントローラーの封じ込めを行っているのかは完全にはわかりませんでした。コードを見ると、コードにいくつかの呼び出しがありませんが、後者を実行しているように見えます。ビューコントローラの封じ込めについて読みたいと思うかもしれません。また、そのWWDC2011セッション102も確認してください。

allocとにかく、View Controller /init以降の上記の2行のコードaddSubviewは、非ARCプロジェクトでリークし(ARCにアクセスしたことがある場合はクラッシュします)、View階層がViewController階層と同期していません。私はあなたが望むかもしれないことを提案します:

SDMenuViewController *mvc = [[[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil] autorelease];
[self addChildViewController:mvc];
[mvc didMoveToParentViewController:self];
[menuView addSubview:mvc.view];

autoreleaseその最初の行に注意してください。

ビューコントローラの封じ込めは強力ですが、この基本的なハウスキーピングの一部を確実に実行する必要があります。


1つの最終更新:

このコードにはいくつかのバグがあることに気づきました。まず、inの使用は機能currentSectionitem:setSubItem:forRowAtIndexPathません。最後のに基づいて設定していますexpandingItem。したがって、いずれかを展開する前に主要な項目の1つをクリックすると、プログラムがクラッシュします。おそらく最善の方法は、currentSection変数を完全に削除し、変数ではなくitem:setSubItem:forRowAtIndexPathを使用することです。item.cellIndexPath.rowcurrentSection

SDNestedTable残念ながら、この修正はより深刻な問題につながります。クラス自体にiOS6のバグがあるようです。これをiOS6で実行し、すべてのアイテムを展開し、下にスクロールしてから上にスクロールすると、によって返されたcellIndexPathプロパティの割り当てが解除される可能性があるため、プログラムがクラッシュします。iOS 6でゾンビをオンにすると、リリースされたことがわかります。元のバージョンをダウンロードしてみたところ、同じ問題が発生しました。問題は、inがプロパティとして定義されていることであるように見えます(つまり、iOSが独自の目的で作成したものが不要になったと判断した場合、iOSは、SDGroupItem *itemitem:setSubItem:forRowAtIndexPathcellIndexPathcellIndexPathSDGroupCellassignindexPathSDGroupCellassignこのリリースされたオブジェクトへの参照)。cellIndexPathのプロパティをSDGroupCellからassignに変更するだけretainで、このiOS6のバグはなくなります。この問題について開発者に通知しましたSDNestedTableが、この変更によりretain、iOS6でコードがクラッシュする問題が修正されます。

[編集:著者はSDNestedTableこの問題の私の評価に同意し、この問題は最新バージョンで修正されたと報告しています。-ロブ]

幸運をお祈りしています。

于 2012-10-09T02:28:31.260 に答える
1

おそらく最初の行のinitWithNibName:インシードを使用する必要がありinitます。あなたの特定の問題についてはよくわかりませんが、確かに試してみるべきことがあります。

于 2012-10-09T02:03:00.787 に答える
0

SDNestedTableView.nibというペン先をインスタンス化しようとしているようですが、存在しません。ペン先はプロジェクトメンバーとして含まれていますか?

于 2012-10-09T05:07:27.653 に答える