Domanda

Sto realizzando un'app per iPad basata su UISplitViewController.Ho un piccolo problema con il pulsante della barra degli strumenti quando la mia app viene avviata in potrait.Il pulsante per mostrare il popover non viene visualizzato.Tuttavia, quando ruoto il mio iPad in orizzontale e poi di nuovo in verticale, il pulsante mostra!

Sembra che il seguente metodo non venga chiamato all'avvio (questo è dove ho il codice che mostra il pulsante):

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

Questo metodo non viene chiamato all'avvio dell'app ma solo quando avviene una rotazione.Ciò che è ancora più strano è che ho creato un'app di prova utilizzando il modello Xcode UISplitViewController + dati core (che è simile all'app su cui sto lavorando ed è il modello che ho usato per creare questa app).Nell'app di prova su cui non ho creato una sola riga di codice, il pulsante viene visualizzato quando avvio la mia app in modalità verticale e il metodo sopra viene richiamato anche all'avvio, a differenza dell'altra mia app.Qualcuno ha avuto un problema simile?

Infine, dalla documentazione di Apple non è molto chiaro se questo metodo debba essere chiamato quando viene mostrato per la prima volta un UISplitViewController:http://developer.apple.com/library/ios/#documentation/uikit/reference/UISplitViewControllerDelegate_protocol/Reference/Reference.html%23//apple_ref/doc/uid/TP40009454

È stato utile?

Soluzione

"Kshitiz" ha il concetto giusto. Innanzitutto ho impostato il self.splitviewcontroller.delegate = self nel metodo ViewDidload, che è un po 'in ritardo per impostare questa delega. Quindi, ho provato a impostare la delega nella fase precedente che è il metodo sveglio. Quindi funziona bene.

Quindi, il problema è dopo la vista già caricata da ViewDidload, quindi la delega non funzionerà, funzionerà qualche tempo dopo alcune attività (come ruotare l'iPad). Quindi la fase precedente di ViewDidload è sveglia.

Ecco il codice che funziona:

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

Altri suggerimenti

Hai impostato un delegato di divieto dicontroller? Generalmente il problema sorge quando il delegato non è impostato.

Stavo avendo lo stesso identico problema e la risposta di Martin Gunnarsson mi ha portato alla soluzione.

In precedenza, stavo impostando la proprietà delegata di UisplitViewController dopo che la vista delegata (la vista dettagliata) era già stata caricata, in viewDidLoad:. A questo punto, l'UisplitViewController aveva già inviato la iniziale splitViewController:willHideViewController:withBarButtonItem:forPopoverController: Messaggio. Semplicemente non avevo impostato il delegato abbastanza presto.

La soluzione era assegnare il delegato nel delegato dell'app principale, in application:DidFinishLaunchingWithOptions:. In questo caso, il mio delegato era contenuto all'interno di un controller di navigazione, quindi ho dovuto scavare uno strato più in profondità per ottenerlo.

- (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;
}

Questo mi ha spinto anche, tanto più da quando sto lavorando a due progetti iPad con splitviewcontroller fuori box e il primo mostra sempre il pulsante "master" mentre il secondo non ha mai fatto. Ho confrontato punti vendita, relazioni e delegati fino a quando non sono stato incrociato, ma alla fine ho trovato la risposta nell'AppDelegate. Si è scoperto che avevo commentato un po 'troppo nell'applicazione: didfinishlaunchingwithoptions:, in particolare dove è impostato il delegato di splitViewController.delegate.

- (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'aggiunta di questo all'appDelegate ti fa risparmiare dal dover sottoclassizzare la divisione. Ho anche provato a collegare il delegato in IB, ma per qualche ragione non avrebbe nulla di tutto ciò. Storyboard Design Flaw, IMHO.

Sono rimasto bloccato su questo per un bel po 'di tempo. Finalmente lo ha fatto funzionare. Il sveglia non ha funzionato per me. Il didfinishlaunchingwithoptions lo ha fatto. Potrebbe essere perché sto eseguendo alcune query che popolano gli articoli nel controller di popover.

Sto riscontrando lo stesso problema.La mia visione è impostata in IB e sembra che si tratti di un problema di tempistica.Il delegato della vista divisa viene impostato dopo che la vista divisa ha notificato la "modifica" dell'orientamento iniziale.L'aggiunta della visualizzazione divisa a una presa nel delegato dell'app mi ha fatto apparire il pulsante all'avvio del ritratto, ma quando apro il popup è vuoto.Probabilmente è possibile risolvere questo problema in qualche modo, ma penso che sia strano che la vista divisa non notifichi al suo delegato l'orientamento corrente quando è impostata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top