Question

Je suis en train de faire une application iPad basée sur un UISplitViewController. J'ai un petit problème avec le bouton toobar lorsque mon application lancée en potrait. Le bouton pour afficher la popover n'apparaît pas. Cependant, quand je tourne mon iPad dans le paysage, puis retour au portrait, le bouton le plus!

Il ressemble à la méthode suivante est pas appelé au lancement (ce qui est été j'ai le code montrant le bouton):

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

Cette méthode est appelée lorsque l'application des lancements, mais seulement quand il y a une rotation. Ce qui est encore plus étrange est que je fait une application de test en utilisant le modèle Xcode UISplitViewController + données de base (qui est similaire à l'application je travaille, et est le modèle que je l'habitude de faire de cette application). Sur l'application de test sur lequel je ne l'ai pas fait une seule ligne de code, le bouton affiche lorsque je lance mon application en mode portrait et la méthode ci-dessus est également appelé lors du lancement, par opposition à mon autre application. Est-ce que quelqu'un avait un problème similaire?

Enfin, il est très clair de la documentation de pomme si cette méthode est censée être appelée lorsqu'un UISplitViewController est d'abord montré: http: // developer.apple.com/library/ios/#documentation/uikit/reference/UISplitViewControllerDelegate_protocol/Reference/Reference.html%23//apple_ref/doc/uid/TP40009454

Était-ce utile?

La solution

"Kshitiz" a le bon concept. d'abord je mis le self.splitviewController.delegate = auto dans la méthode viewDidLoad, qu'il est un peu tard pour définir cette délégation. Alors, j'ai essayé de mettre la délégation au stade antérieur qui est la méthode awakeFromNib. Ensuite, il fonctionne bien.

Alors, le problème est déjà chargé après vue par viewDidLoad, la délégation ne fonctionnera pas, il travaillera quelque temps après certaines activités (comme l'iPad rotate). Ainsi, le stade plus précoce que viewDidLoad est awakeFromNib.

Voici le code qui fonctionne:

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}

Autres conseils

Avez-vous défini un délégué splitviewcontroller? En général, le problème se pose lorsque délégué n'est pas réglé.

Je faisais exactement le même problème, et la réponse de Martin Gunnarsson m'a conduit à la solution.

Avant, je mettais la propriété délégué du UISplitViewController après le point de vue des délégués (la vue détaillée) avait déjà été chargé, en viewDidLoad:. A cette époque, le UISplitViewController avait déjà envoyé le message splitViewController:willHideViewController:withBarButtonItem:forPopoverController: initial. J'avais tout simplement pas régler le délégué assez tôt.

La solution a consisté à attribuer le délégué principal délégué de l'application, dans application:DidFinishLaunchingWithOptions:. Dans ce cas, mon délégué a été contenu dans un contrôleur de navigation, donc je devais creuser une couche plus profonde pour l'obtenir.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1];
    HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0]; 

    splitViewController.delegate = mainViewController;
    return YES;
}

Cela me conduit épargnerai aussi bien, d'autant plus depuis que je travaille sur deux projets iPad avec hors-the-box splitViewController et la première montre toujours le bouton « Master » tandis que le second n'a jamais fait. Je comparais points de vente et les relations et les délégués jusqu'à ce que je louchait, mais finalement trouvé la réponse dans le appDelegate. Il est avéré que j'avais commenté un peu trop dans l'application: didFinishLaunchingWithOptions :, en particulier où le splitViewController.delegate est réglé.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }

L'ajout de ce à appDelegate vous évite d'avoir à sous-classe la splitViewController. J'ai aussi essayé de connecter le délégué IB, mais pour une raison quelconque il n'aurait pas rien de tout cela. défaut de conception de Storyboard, IMHO.

J'étais coincé là-dessus depuis un certain temps. Enfin eu à travailler. Le awakeFromNib ne fonctionne pas pour moi. Les didFinishLaunchingWithOptions ont fait. Peut-être parce que je me présente une requête qui renseigne les éléments du contrôleur popover.

Je vais avoir le même problème. Mon point de vue est mis en place dans IB, et il semble que ce soit un problème de synchronisation. Le délégué de vue partagé se défini après le point de vue partagé a informé au sujet de l'orientation initiale « changement ». Ajout de la vue fractionnée à une prise dans le délégué de l'application fait le bouton apparaît au démarrage du portrait pour moi, mais quand j'ouvre la fenêtre, il est vide. Cela peut probablement être contournée en quelque sorte, mais je pense qu'il est étrange que le point de vue partagé ne notifie pas son délégué sur l'orientation actuelle lorsqu'elle est définie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top