2011-10-16 10 views
20

Questo potrebbe non essere possibile, ma spero che qualcuno abbia un'idea di come farlo.pulsante di creazione per l'ancoraggio della vista popover in fase di esecuzione

Ho un'app che sto trasferendo da iPhone solo su Universal. Su iPhone, sto usando un'applicazione Tabbed. Io uso tre schede per i dati normali da visualizzare. Ho una quarta scheda che viene visualizzata solo se sono soddisfatte determinate condizioni. Per aggiungere la scheda, lo faccio:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
{ 
    UITabBarController *tabController = (UITabBarController *) self.rootViewController; 
    NSMutableArray* newArray = [NSMutableArray arrayWithArray: tabController.viewControllers]; 
    [newArray addObject: [theStoryboard instantiateViewControllerWithIdentifier: @"AdditionalView-Phone"]]; 
    [tabController setViewControllers:newArray animated:YES]; 
} 

per l'iPad, ho abbastanza spazio sulla vista iniziale per visualizzare tutto dai principali tre schede in iPhone UI. Quindi tutto ciò di cui ho bisogno è una vista aggiuntiva (piccola) per i dati "aggiuntivi". Volevo farlo usando una vista popOver, quindi ho impostato la vista iniziale con una barra di navigazione e un pulsante popover come nel modello di Utility App. Ma ora sono bloccato. Non riesco a capire come creare quel pulsante popover in fase di esecuzione e far sì che segua correttamente la visualizzazione di popOver. Posso aggiungere il pulsante in questo modo:

UIBarButtonItem *flipButton = [[UIBarButtonItem alloc] initWithTitle: @"Modem" style: UIBarButtonItemStylePlain target: self action: @selector(togglePopover:)]; 
self.navBar.topItem.rightBarButtonItem = flipButton; 

ma ottengo un'eccezione: 'NSInternalInconsistencyException', la ragione: 'UIStoryboardPopoverSegue deve essere presentata da un elemento pulsante della barra o una vista' Sono sicuro che questo è perché non ho un set di ancoraggio per il seguito di popOver. Il pulsante non esiste nello storyboard, quindi non posso impostarlo lì. E non riesco a trovare un'API per impostarlo in fase di esecuzione.

Ho anche provato a creare il pulsante in IB, ma non nella gerarchia della vista, e quindi semplicemente impostando la proprietà rightBarButtonItem sul mio pulsante esistente. Anche questo funziona, ma non riesco ancora a impostare quel pulsante come ancoraggio per la visualizzazione popover. Posso impostare la barra di navigazione come ancoraggio, ma questo rende ancorabile al titolo nella barra di navigazione, che sembra sciocca.

Qualche idea?

+0

Ehi, @Flyingdiver hai trovato una soluzione a questo? – Rog

+0

Sì, crea un UIView nascosto dal quale presentare il popover e muoverlo ovunque ti serva. –

risposta

13

Ho avuto lo stesso problema e l'ho risolto creando un UIBarButtonItem nello storyboard per il controller della vista ma non facente parte della gerarchia della vista.

In IB, trascinare una voce di pulsante sulla barra scura sotto la vista del controller di visualizzazione, rilasciarla accanto alle icone "Primo risponditore" e "Visualizza controller". Crea un IBOutlet (forte) per questo. Quindi creare un popover seguito da esso al controller della vista di destinazione trascinando dalla voce del pulsante della barra sulla destinazione. Sembra che questo sia l'unico modo per impostarlo come ancoraggio. La scelta come ancoraggio per un passaggio esistente non funziona (sembra un bug IB).

enter image description here

In viewDidLoad è possibile assegnare questa barra elemento pulsante per la navigationItem (o dove mai volete) e la segue funziona come previsto.

3

Ero curioso anche di questo, quindi ho fatto un rapido test di progetto. Hai ragione, non sembra che ci sia un modo per configurare il seguito del popover in fase di runtime o aggiungere un punto di ancoraggio a un pulsante che non si trova nella gerarchia della vista utilizzando Interface Builder.

La mia soluzione era quella di impostare tutto in IB con la UIBarButtonItem visibile e collegato ad una proprietà IBOutlet, quindi rimuoverlo dalla barra di navigazione in -viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.navigationItem.rightBarButtonItem = nil; 
} 

Poi ho semplicemente aggiungere indietro o rimuoverlo toccando un altro tasto:

- (IBAction)toggleBarButtonItem:(id)sender 
{ 
    UIBarButtonItem *item = (self.navigationItem.rightBarButtonItem == nil) ? self.popoverBarButtonItem : nil; 
    [self.navigationItem setRightBarButtonItem:item animated:YES]; 
} 

Si potrebbe condizionatamente mantenere o rimuovere il pulsante nella -viewDidLoad allo stesso modo. Il seguito rimane ancorato allo UIBarButtonItem.

2

Non sono sicuro che sia esattamente quello che vuoi, ma questo è quello che farei. Crea un pulsante e impostalo con qualche obiettivo/azione. Chiamare tale metodo di destinazione/azione

presentPopover:(UIButton *)sender; 

Poi nel metodo presentPopover, dico

UIViewController *customAdditionalViewController = [[MySpecialVC alloc] init]; 
//Configure the customAdditionalViewController 
//Present the customAdditionalViewController in a Popover 
UIPopoverController *popover = [[UIPopoverController alloc] initWithViewController:customAdditionalViewController]; 
//Set popover configurations 
[popover presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections:/*whatever you want*/ animated:YES]; 

che è come avrei gestire il vostro caso d'uso.

3

sto andando provare a fare una vista fittizio che è la dimensione e la forma dei punti di vista che voglio presentare la popover da, filo che al bersaglio segue popover, e quindi spostare la vista nella posizione giusta in prepareForSegue:sender:

+0

Funziona! Neanche la vista fittizia nascosta sembra causare problemi. –

Problemi correlati