web-dev-qa-db-fra.com

Comment masquer et afficher le contrôleur de la vue Master dans SplitViet Controller

J'ai créé un nouveau projet basé sur la vue Split dans mon Xcode 4.2

Puis dans DetailViewController.m fichier j'ai ajouté cette méthode

- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{
  //This method is only available in iOS5  

   return NO;
}

Maintenant, en faisant cela, je peux afficher une partie gauche et droite de mon contrôleur SplitView à la fois.

Maintenant, j'ai ajouté un UIBarButtonItem dans ma barre de navigation DetailViewController et je veux en utilisant lesquelles je peux masquer et montrer ma vision de mon maître en mode Portrairt et Paysage.

- (IBAction)hideUnhide:(id)sender 
{

//How can hide & unhide

}

Comment puis-je faire ceci?

21
user930195
instead spv.delegate=nil; spv.delegate=self;

vous devez faire ensuite:

[spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
9
Philip J. Fry

Dans iOS 5.1, vous devez le faire de cette façon:

À l'intérieur DetailViewController.m

- (IBAction)hideUnhide:(id)sender  {
    UISplitViewController* spv = ...;

    self.hideMaster= !self.hideMaster;

    [spv.view setNeedsLayout];
    spv.delegate = nil;
    spv.delegate = self;
}

- (BOOL)splitViewController:(UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
    return self.hideMaster;
}
6
Manni

J'ai combiné les réponses ci-dessus et les œuvres suivantes bien dans IOS 6:

// In split delegate
-(void)hideMaster:(BOOL)hideState
{
   _masterIsHidden = hideState;

   [self.splitViewController.view setNeedsLayout];
   self.splitViewController.delegate = nil;
   self.splitViewController.delegate = self;

   [self.splitViewController willRotateToInterfaceOrientation:[UIApplication    sharedApplication].statusBarOrientation duration:0];
}

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
    return self.masterIsHidden;
}
4
Rudy
-(IBAction)clickToShowMaster:(id)sender
{
 UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"prev.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToHidemaster:)];
 self.navigationItem.leftBarButtonItem = systemItem1;
[self.tabBarController.tabBar setHidden:NO];
[self hideMaster:NO];
}
-(void)hideMaster:(BOOL)hideState
{

ishideMaster=hideState;
[self.splitViewController.view setNeedsLayout];
self.splitViewController.delegate = nil;
self.splitViewController.delegate = self;

[self.splitViewController willRotateToInterfaceOrientation:[UIApplication    sharedApplication].statusBarOrientation duration:0];

 }

-(void)hideMaster:(BOOL)hideState
{
ishideMaster=hideState;
[self.splitViewController.view setNeedsLayout];
self.splitViewController.delegate = nil;
self.splitViewController.delegate = self;

[self.splitViewController willRotateToInterfaceOrientation:[UIApplication    sharedApplication].statusBarOrientation duration:0];

}


    #pragma mark - Split view

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{

    if(UIInterfaceOrientationIsPortrait(orientation))
    {
        UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"down.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showPopup)];
        self.navigationItem.leftBarButtonItem = systemItem1;
        [self setUIforPortrait];
        return YES;
    }
     if (UIInterfaceOrientationIsLandscape(orientation))
    {
        if(ishideMaster==TRUE)
        {
            UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"next.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToShowMaster:)];
            self.navigationItem.leftBarButtonItem = systemItem1;
            [self setUIForFullLandscape];
        }
        else
        {
            UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"prev.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToHidemaster:)];
            self.navigationItem.leftBarButtonItem = systemItem1;
            [self setUIForHalfLandscape];
        }
        return ishideMaster;
    }

}
//add the navigation button on left top, to pop-up master view.
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    [barButtonItem setImage:[UIImage imageNamed:@"down.png"]];

    UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"down.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showPopup)];
    self.navigationItem.leftBarButtonItem = systemItem1;
   self.masterPopoverController = popoverController;
    self.masterPopoverController.delegate=self;
}

- (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.
    //;
    if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
    {
        if(ishideMaster==FALSE)
        {
            UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"prev.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToHidemaster:)];
            self.navigationItem.leftBarButtonItem = systemItem1;
        }
        else
        {
            UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"next.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clickToShowMaster:)];
            self.navigationItem.leftBarButtonItem = systemItem1;

        }
    }
    else if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
    {
        [self.navigationItem setLeftBarButtonItem:nil animated:YES];

    }
   //self.masterPopoverController = nil;
}

En ce qui concerne le commentaire de WZBOZON sur le fait de ne pas avoir besoin de réaffecter le délégué, j'ai trouvé que les deux lignes

self.splitViewController.delegate = nil;

self.splitViewController.delegate = self;

... n'étaient pas nécessaires sur le simulateur mais étaient nécessaires sur mon iPad iOS5 1. Sans eux, le comportement de masquage/spectacle ne s'est pas produit (en cliquant sur le bouton n'a pas réduit la vue Master).

1
Jack Bellis

Vous pouvez afficher/masquer la visualisation principale en déclenchant l'action de la propriété displayModeButtonItem de UISplitViewController:

Swift

if let displayModeButtonItem = splitViewController?.displayModeButtonItem() {
    displayModeButtonItem.target?.performSelector(displayModeButtonItem.action)
}

Objectif c

UIBarButtonItem *displayModeButtonItem = [self.splitViewController displayModeButtonItem];
[displayModeButtonItem.target performSelector: displayModeButtonItem.action];

Cela me semble plus approprié que de moi-même avec le délégué, l'orientation et la mise en page en même temps.

0
Raphaël

Eh bien, la partie facilité de votre question est d'utiliser un Bool, dites une propriété Hidemaster, puis

- (IBAction)hideUnhide:(id)sender 
{

   self.hideMaster= !self.hideMaster;

}

puis...

- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{
  //This method is only available in iOS5  

   return self.hideMaster;
}

Cela fonctionne bien, mais le devoirViewController n'est appelé que lors d'une redessinée du splitvc, telle que pendant une rotation, le Maître ne se cache donc que.

0
mackworth

Swift 3.

J'ai utilisé

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail" {
            if let indexPath = self.tableView.indexPathForSelectedRow {
                let object = self.exercises[indexPath.row] 
                let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
                controller.detailItem = object
                controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem
                controller.navigationItem.leftItemsSupplementBackButton = true
                UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseOut], animations: {
                    self.splitViewController?.preferredDisplayMode = .primaryHidden
                }, completion: nil)

            }
        }
    }
0
catu