0

iOS 6 iPadで問題に直面しています

  1. ボタンクリック時 - > UITableでポップオーバーを開く
  2. 行を選択すると-> modalviewcontrollerが開きます。
  3. modalviewcontroller を閉じる (正常に動作します)
  4. 次に、もう一度ボタンをクリックすると、ボタンのクリックでアプリがクラッシュします(最初のステップ)

この問題は iOS 6 のみです。iOS 5、iOS 4.3 では問題なく動作します。

*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UITableView: 0xb847400; frame = (0 0; 185 104); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xa469e50>; layer = <CALayer: 0xa469f00>; contentOffset: {0, 0}> is associated with <UIViewController: 0xa462f60>. Clear this association before associating this view with <UIViewController: 0xa5dac40>.'
*** First throw call stack:
(0x2769012 0x1d0be7e 0x2768deb 0xca1309 0xd385ac 0xd34a90 0x69b19 0x1d1f705 0xc56920 0xc568b8 0xd17671 0xd17bcf 0xd16d38 0xc8633f 0xc86552 0xc643aa 0xc55cf8 0x29a2df9 0x29a2ad0 0x26debf5 0x26de962 0x270fbb6 0x270ef44 0x270ee1b 0x29a17e3 0x29a1668 0xc5365c 0x24ca 0x23d5)
libc++abi.dylib: terminate called throwing an exception

コードの追加

listTable.frame = CGRectMake(0, 0, listWidth, listItemHeight*[listArray count]-1);
UIViewController* popoverContent = [[UIViewController alloc] init];
popoverContent.view = listTable;
popoverContent.contentSizeForViewInPopover = CGSizeMake(listWidth, listItemHeight*[listArray count]);
listPopOver = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
[listPopOver setDelegate:self];
[listPopOver setPopoverContentSize:listTable.frame.size];
[listPopOver presentPopoverFromRect:self.frame inView:self.superview permittedArrowDirections:arrowDirection animated:YES];
[listTable reloadData];
[popoverContent release];
4

2 に答える 2

5

例外をより詳しく確認してください。

'UIViewControllerHierarchyInconsistency', reason:
'A view can only be associated with at most one view controller at a time!
View UITableView: 0xb847400; frame = (0 0; 185 104); clipsToBounds = YES;
autoresize = W+H; gestureRecognizers = NSArray: 0xa469e50; layer = CALayer: 0xa469f00;
contentOffset: {0, 0} is associated with UIViewController: 0xa462f60.
Clear this association before associating this view with UIViewController: 0xa5dac40.'

具体的には:

A view can only be associated with at most one view controller at a time!
View UITableView: 0xb847400
is associated with
UIViewController: 0xa462f60. 
Clear this association before associating this view with 
UIViewController: 0xa5dac40.

これは、View Controller があり、その.viewプロパティが listTable オブジェクトに設定されていることを意味します。次に、その関連付けを破棄せずに、別のビュー コントローラーを取得して、その.viewプロパティを listTable オブジェクトに設定しようとしました。これは、iOS 6.0 の時点で Apple がより厳しく適用しているビュー階層規則に違反しており、現在では例外をスローしてアプリをクラッシュさせています。

したがって、ここでの本当の問題は、2 つのビュー コントローラーで同じ listTable オブジェクトを使用していることです。具体的にはpopoverContent. これは、コードが 2 回目に実行されたときに古い popoverContent がまだ存在していることを意味します。これが、最初の実行ではなく 2 回目の実行でクラッシュする理由です。どういうわけか、新しいポップオーバーが作成される前に、コードが古いポップオーバーの割り当てを完全に解除して破棄していないと思います。これが確実に発生する場合は、問題ない可能性があります。

また、明らかに、両方のポップオーバーに同じ listTable を使用していることにも気付きました。この listTable を維持するのではなく、ポップオーバーごとに遅延して作成したいですか?

さらに調査したい場合は、poコマンドを使用してコードにブレークポイントを設定し、さまざまなビューとビュー コントローラーの説明を出力して、後で例外に表示されるものと一致する 16 進アドレスを確認し、さらに取得することができます。問題に関する情報。または、16 進アドレスを直接使用して説明を出力することもできますpo 0xa469e50(ただし、型キャストする必要がある場合があります)。

それ以外は、誰かがそれを見て何が問題なのかを言うのに十分なコードを実際に提供していません:)しかし、上記はあなたがそれを解決するのに役立つはずです.

于 2012-10-25T21:06:35.177 に答える
1

のビューを置き換えるのではなく、 をサブビューとしてpopoverContent追加していただけませんか?listTable

それが探しているものを完全に達成するかどうかはわかりませんが、階層の不一致エラーを回避できる可能性があります。

于 2012-10-26T01:27:36.340 に答える