3

Je souhaite que le pop-over apparaisse lorsque l'application est lancée en mode portrait au lieu d'être masqué, ce qui oblige l'utilisateur à cliquer sur le bouton avant que le survol ne s'affiche. J'ai essayé de trouver des solutions à travers les goûts de Google et d'autres threads StackOverflow, mais je n'ai pas été capable de le comprendre. Donc, dans le cas où l'exemple standard SplitView qui est créé par XCode est différent, je vais mettre le code ci-dessous. Si je peux le faire fonctionner sur cette application, j'espère que je peux le comprendre et être capable de l'appliquer ailleurs.Impossible de faire apparaître UIPopover par programme

J'ai pensé à essayer d'appeler simplement ce qu'on appelle quand le bouton est poussé ... mais je ne peux pas comprendre ce qui est appelé et où il est déclaré ... Je me sens comme si je néglige quelque chose de basique et ça me conduit des bananes!

Le contrôleur DetailView DetailViewController.h

#import <UIKit/UIKit.h> 

@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate> { 

UIPopoverController *popoverController; 
UIToolbar *toolbar; 

id detailItem; 
UILabel *detailDescriptionLabel; 
} 

@property (nonatomic, retain) IBOutlet UIToolbar *toolbar; 

@property (nonatomic, retain) id detailItem; 
@property (nonatomic, retain) IBOutlet UILabel *detailDescriptionLabel; 

@end 

DetailViewController.m

#import "DetailViewController.h" 
#import "RootViewController.h" 


@interface DetailViewController() 
@property (nonatomic, retain) UIPopoverController *popoverController; 
- (void)configureView; 
@end 



@implementation DetailViewController 

@synthesize toolbar, popoverController, detailItem, detailDescriptionLabel; 

#pragma mark - 
#pragma mark Managing the detail item 

/* 
When setting the detail item, update the view and dismiss the popover controller if    it's showing. 
*/ 
- (void)setDetailItem:(id)newDetailItem { 
    if (detailItem != newDetailItem) { 
     [detailItem release]; 
     detailItem = [newDetailItem retain]; 

     // Update the view. 
     [self configureView]; 
    } 

    if (self.popoverController != nil) { 
     [self.popoverController dismissPopoverAnimated:YES]; 
    }   
} 


- (void)configureView { 
    // Update the user interface for the detail item. 
    detailDescriptionLabel.text = [detailItem description]; 
} 


#pragma mark - 
#pragma mark Split view support 

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

barButtonItem.title = @"Root List"; 
NSMutableArray *items = [[toolbar items] mutableCopy]; 
[items insertObject:barButtonItem atIndex:0]; 
[toolbar setItems:items animated:YES]; 
[items release]; 
self.popoverController = pc; 
} 


// 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 { 

NSMutableArray *items = [[toolbar items] mutableCopy]; 
[items removeObjectAtIndex:0]; 
[toolbar setItems:items animated:YES]; 
[items release]; 
self.popoverController = nil; 
} 


#pragma mark - 
#pragma mark Rotation support 

// Ensure that the view controller supports rotation and that the split view can therefore show in both portrait and landscape. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return YES; 
} 


#pragma mark - 
#pragma mark View lifecycle 

/* 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
[super viewDidLoad]; 
} 
*/ 

/* 
- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
} 
*/ 
/* 
- (void)viewDidAppear:(BOOL)animated { 
[super viewDidAppear:animated]; 
} 
*/ 
/* 
- (void)viewWillDisappear:(BOOL)animated { 
[super viewWillDisappear:animated]; 
} 
*/ 
/* 
- (void)viewDidDisappear:(BOOL)animated { 
[super viewDidDisappear:animated]; 
} 
*/ 

- (void)viewDidUnload { 
// Release any retained subviews of the main view. 
// e.g. self.myOutlet = nil; 
self.popoverController = nil; 
} 


#pragma mark - 
#pragma mark Memory management 

/* 
- (void)didReceiveMemoryWarning { 
// Releases the view if it doesn't have a superview. 
[super didReceiveMemoryWarning]; 

// Release any cached data, images, etc that aren't in use. 
} 
*/ 

- (void)dealloc { 
[popoverController release]; 
[toolbar release]; 

[detailItem release]; 
[detailDescriptionLabel release]; 
[super dealloc]; 
} 

@end 

Le rootview est un UITableViewController typique et est rien de spécial, mais si pour une raison quelconque vous avez besoin cela ou le délégué (ce qui est assez ennuyeux moins le chargement des vues) pour m'aider à comprendre ce problème, je n'ai aucun problème s affichant ceux aussi. Encore une fois c'est ce que génère XCode quand je lui dis que je veux créer une vue partagée pour l'iPad et je ne l'ai pas modifié.

J'espère qu'il y a quelque chose de très mineur que je suis en train de négliger et il me fera claquer la tête et dire "Je ne peux pas croire que j'ai raté ça!" Merci de votre aide.

Répondre

3

Compris!

Je mis

[self.popoverController presentPopoverFromBarButtonItem:[[toolbar items] objectAtIndex:0] permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 

dans la méthode viewDidLoad. Je savais que c'était quelque chose de très simple! Cela semble fonctionner sans aucun problème!

Questions connexes