4

5 つの splitviewcontrollers を含むタブ付きアプリケーションがあります。

ポートレート モードでは、「マスター」ボタンが期待どおりに表示され、最初の 2 つのコントローラーではそのボタンが期待どおりに動作します。ただし、最後の 3 つのタブでは、ボタンを押すと次のメッセージが表示されてクラッシュします。

-[_UISlidingPopoverLayoutInfo _popoverViewSizeForContentSize:arrowDirection:]、/SourceCache/UIKit_Sim/UIKit-1914.84/_UIPopoverLayoutInfo.m:160 2012-04-24 19:15:38.674 SMToolkit[12420:11303] でのアサーションの失敗*キャッチされない例外によるアプリの終了 ' NSInternalInconsistencyException'、理由: '不明な方向が _popoverViewSizeForContentSize:arrowDirection に渡されました:'

問題は、5 つのビューが同じソース (ほぼ Apple のボイラープレート) からカット アンド ペーストされたものだということです。私は実際にポップオーバーのストーリーボードを作成していません。また、splitviewcontroller が理論的に「無料」でそれらを提供するため、prepareforsegue メソッドでそれらを持っているわけでもありません。

5 つの splitviewcontrollers はすべて UISplitViewControllerDelegate に準拠しています

appdelgate は次のようになります。

    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
   //Person
    UISplitViewController *personSplitViewController = [tabBarController.viewControllers objectAtIndex:1];
    UINavigationController *personNavigationController = [personSplitViewController.viewControllers lastObject];
    personSplitViewController.delegate = (id)personNavigationController.topViewController;
    UINavigationController *personMasterNavigationController = [personSplitViewController.viewControllers objectAtIndex:0];
    PersonMasterViewController *personController = (PersonMasterViewController *)personMasterNavigationController.topViewController;
    personController.managedObjectContext = self.managedObjectContext;
    //Scene
    UISplitViewController *sceneSplitViewController = [tabBarController.viewControllers objectAtIndex:2];
    UINavigationController *sceneNavigationController = [sceneSplitViewController.viewControllers lastObject];
    sceneSplitViewController.delegate = (id)sceneNavigationController.topViewController;
    UINavigationController *sceneMasterNavigationController = [sceneSplitViewController.viewControllers objectAtIndex:0];
    SceneMasterViewController *sceneController = (SceneMasterViewController *)sceneMasterNavigationController.topViewController;
    sceneController.managedObjectContext = self.managedObjectContext;

など、tabBarController の正しいインデックスに置き換えます

次に、詳細ビューコントローラーには、それぞれに次のものがあります(同一、確認しました):

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.title = NSLocalizedString(@"Master", @"Master");
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}


- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.masterPopoverController = nil;
}

上記では、'person' は期待どおりに動作しますが、'scene' はクラッシュを引き起こします。

そのバーボタン項目がクリックされたときに何が起こるかについて話しているビューのどこにも表示されず、ストーリーボードにも表示されません。

アイデア?

4

3 に答える 3

2

残念ながら、少なくとも私の場合は、コードに非常にばかげたバグがあったというのが答えでした。

何が起こっていたかというと、マスター ビューの viewWillAppear で、detailview に何かを設定していて、マスター ビューを表示しようとしていたということです。それを取り除き、各ビューコントロールだけを作成することで問題が解決しました。

于 2012-05-26T19:16:37.120 に答える
1

エラーは少し不可解です。誤っ [UIPopoverController presentPopoverFromBarButtonItem: permittedArrowDirections:]てシーケンスで 2 回呼び出していたときに同じエラーが発生し、2 回目の呼び出しはポップオーバーがレンダリング/アニメーション化されているときです。

于 2012-05-24T11:01:42.840 に答える
0

アサーション失敗エラーは、いずれかの方法で nil が返された場合にのみ発生します。したがって、すべての変数に対して set self を設定し、nil をチェックすることをお勧めします。

于 2012-05-29T13:39:00.647 に答える