2

単純なUISplitViewControllerを実装しようとしています。ポートレートモードでは、マスタービューが非表示になり、ポップオーバーにボタンが表示されます。

私のAppDelegateは次のように設定されています。

       - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

            // Override point for customization after app launch.
            self.splitViewController =[[UISplitViewController alloc]init];
            self.rootViewController=[[RootViewController alloc]init];
            self.detailViewController=[[FirstDetailViewController alloc]init];

            UINavigationController *rootNav=[[UINavigationController alloc]initWithRootViewController:rootViewController];
            UINavigationController *detailNav=[[UINavigationController alloc]initWithRootViewController:detailViewController];


            self.splitViewController.viewControllers=[NSArray arrayWithObjects:rootNav,detailNav,nil];
            self.splitViewController.delegate=self.detailViewController;
            splitViewController.presentsWithGesture = NO;

            // Add the split view controller's view to the window and display.
            [self.window setRootViewController:self.splitViewController];

[window makeKeyAndVisible];

        return YES;
    }

FirstDetailViewControllerで、次のようなボタンを設定しました。

UIImage *buttonImage = [UIImage imageNamed:@"button-menu.png"];
    UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [aButton setImage:buttonImage forState:UIControlStateNormal];
    aButton.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
    [aButton addTarget:self action:@selector(showNavigation) forControlEvents:UIControlEventTouchUpInside];
    aBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aButton];
    self.appDelegate.rootPopoverButtonItem = aBarButtonItem;

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

-(void)showNavigation{

    NSLog(@"I am in show navigation and pc=%@",self.popoverController);

    [self.popoverController presentPopoverFromRect:self.view.frame
                                            inView:self.view
                          permittedArrowDirections:UIPopoverArrowDirectionAny
                                          animated:YES];
}

最初にアプリをロードしてボタンを押すと、次のNSLogが表示されます。

I am in show navigation and pc=(null)

そして、ポップオーバーは表示されません。これで、デバイスを横向きモードに回転させてから縦向きに戻すと、マスタービューが期待どおりに非表示および表示され、ボタンが縦向きモードで機能するようになりました。

回転を処理するコードは次のとおりです。

- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc {


    [[self navigationItem] setLeftBarButtonItem:aBarButtonItem];
    [self setPopoverController:pc];
    self.appDelegate.rootPopoverButtonItem = aBarButtonItem;

}


// Called when the view is shown again in the split view, invalidating the button and popover controller.
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
    [[self navigationItem] setLeftBarButtonItem:nil];
    [self setPopoverController:nil];
    self.appDelegate.rootPopoverButtonItem = aBarButtonItem;

}

回転が発生する前にpopovercontrollerをnullにしないようにするにはどうすればよいですか?

4

1 に答える 1

0

[self setPopoverController:pc]を含まないifがwillHideViewControllerにあることがわかりました。ライン。当たり前!

于 2012-10-21T18:01:17.537 に答える