Video: Building Dynamic Web Apps with Laravel by Eric Ouyang 2024
Poiché potresti sostituire il controller di visualizzazione nella tua app iOS con uno nuovo - anche se appartenente alla stessa classe base - il nuovo controller di visualizzazione ha nessun accesso al pulsante che deve visualizzare o al popover che deve essere eliminato. Fortunatamente, la gente di Apple offre un posto perfetto per farlo.
Quando viene attivato un seguito - che si fa quando si tocca una voce di tabella - ma prima che il nuovo controller faccia scorrere la vista in posizione, il runtime dello storyboard chiama il metodo del controller di visualizzazione corrente in modo che possa trasferire i dati al controller di visualizzazione che è sta per essere mostrata.
Ciò significa che è possibile passare le informazioni sul pulsante al nuovo controller di visualizzazione prima ancora che venga avviato. Quindi, prepareForSegue: sender:, entrambi assegneranno il pulsante da utilizzare in viewDidLoad e chiuderanno anche il controller della vista.
prepareForSegue: mittente: è un metodo di controllo della vista che notifica a un controller di visualizzazione che sta per essere eseguito un passaggio. segue è l'oggetto UIStoryboadSegue e contiene informazioni sui controller della vista coinvolti nel seguito.
Anche se l'implementazione predefinita di questo metodo non fa nulla, le sottoclassi di UIViewController possono sovrascriverle e passare i dati al controller della vista che sta per essere visualizzato. L'oggetto segue ha proprietà che puntano al controller della vista sorgente e al controller della vista di destinazione. Il seguito è l'unico oggetto che conosce contemporaneamente sia i controller di visualizzazione di origine che di destinazione.
mittente è l'oggetto che ha causato il seguito, ma non sarà necessario utilizzarlo qui.
Si aggiunge il codice al metodo prepareForSegue: sender: per rendere il DestinationController delegato da UISplitViewController e assegnare le proprietà popOverButton e masterPopoverController.
Inoltre, il popover viene rimosso quando è presente, quindi l'utente non deve toccare la vista per sbarazzarsi di esso.
Per fare tutto questo, aggiungi questo codice a MasterViewController. m.
- (void) prepareForSegue: (UIStoryboardSegue *) segue mittente: (id) sender {if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {DetailViewController * currentDetailViewController; if ([[self. splitViewController. viewControllers lastObject] isKindOfClass: [classe UINavigationController]]) currentDetailViewController = (DetailViewController *) ((UINavigationController *) [self. splitViewController. viewControllers lastObject]). topViewController; else currentDetailViewController = [self.splitViewController. viewControllers lastObject]; if (currentDetailViewController. masterPopover Controller! = nil) [currentDetailViewController. masterPopover Controller dismissPopoverAnimated: YES]; DetailViewController * destinationDetailViewController; if ([segue: destinationViewController isKindOfClass: [UINavigationController class]]) destinationDetailViewController = (DetailViewController *) ((UINavigationController *) segue. destinationViewController). topViewController; else destinationDetailViewController = segue. destinationViewController; se stesso. splitViewController. delegate = destinationDetailViewCon troller; destinationDetailViewController. popOverButton = currentDetailViewController. popOverButton; destinationDetailViewController. masterPopoverController = currentDetailViewController. masterPopoverController;}}
Si inizia trovando il controller della Vista dettagliata corrente perché ha le proprietà del pulsante e del popover necessarie per il nuovo controller della vista.
Questo codice sembra più complicato di quello che è. Per prima cosa controlla se stai utilizzando un iPad. In tal caso, si ottiene il controller della vista dettagliata corrente accedendo all'elenco dei controller della vista nell'array viewController di splitViewController. Fortunatamente, la classe UIViewController ha una proprietà splitViewController per renderla più facile.
Quindi si controlla se un controller di navigazione si trova nell'array viewControllers e, se presente, si ottiene il controller ViewView del controller di navigazione (il controller della vista corrente); in caso contrario, è sufficiente utilizzare il controller nell'array. (Noterai un sacco di casting in corso qui)
if ([[self. SplitViewController. ViewControllers & # x2028; lastObject]isKindOfClass: [UINavigationController & # x2028; class]])
currentDetailViewController = (RTDetailViewController *)
(UINavigationController *)
[self. splitViewController. viewControllers
LastObject]). topViewController; else
currentDetailViewController = & # x2028; [se stesso. splitViewController. viewControllers
LastObject];
Quindi, se vedi un popover, vuoi chiuderlo. Controllate per vedere se un controller popover (è per questo che avete reso accessibile la proprietà spostandola nel file di intestazione.
if (currentDetailViewController. MasterPopoverController! = Nil)
[currentDetailViewController. MasterPopoverController > dismissPopoverAnimated: YES];
Successivamente, si trova il nuovo controller di destinazione (quello a cui è stata eseguita la transizione) utilizzando la logica simile alla logica utilizzata per trovare il controller di visualizzazione dettagli corrente.
if ([segue. destinationViewController < & # x2028; isKindOfClass: [UINavigationController
class]]) destinationDetailViewController =(DetailViewController *) ((UINavigationController *)
segue. DestinationViewController). TopViewController; else
destinationDetailViewController =
segue. destinationViewController;
Quindi è sufficiente impostare il delegato Split View Controller sul nuovo controller di visualizzazione, in modo da ottenere splitViewController: willHideViewController: withBarButtonItem: forPopoverController: an d splitViewController: willShowViewController: invalidatingBarButtonItem: messages.
di sé. splitViewController. delegate = destinationDetailViewController;
Infine, si assegnano le proprietà popOverButton e masterPopOverController nel nuovo controller di visualizzazione.
destinationDetailViewController. popOverButton =
currentDetailViewController. popOverButton;
destinationDetailViewController. masterPopoverController =currentDetailViewController. masterPopoverController;
Certamente, questo semplicemente elimina il popover e assegna le proprietà, ma non fa nulla per visualizzare il pulsante. Questo viene effettivamente fatto in viewDidLoad.
È anche possibile specificare la dimensione della finestra popover assegnando un valore alla proprietà prefferedContentSize. È necessario essere consapevoli che la dimensione effettiva può essere ridotta in modo che il popover si adatti allo schermo e che il popover non si sovrapponga a una tastiera quando viene presentata una tastiera. Puoi vedere il codice che lo fa nel metodo awakeFromNib di MasterViewController.
- (void) awakeFromNib {if ([[UIDevice currentDevice]
userInterfaceIdiom] == UIUserInterfaceIdiomPad)
& # x2028; {se stesso. clearsSelectionOnViewWillAppear = NO;di sé. preferredContentSize = CGSizeMake
(320, 0, 600. 0);} [super awakeFromNib];}
Il messaggio awakeFromNib viene inviato a un oggetto che è stato istanziato dallo storyboard dopo che tutti gli oggetti sono stati caricati e inizializzati. Quando il messaggio viene inviato, sono state impostate tutte le connessioni di uscita e di azione.
Se decidi di ignorare il consiglio qui e non chiudere il controller popover, tocca fuori dalla finestra popover e il popover verrà rimosso. Tuttavia, è possibile consentire all'utente di interagire con le viste specificate e non ignorare il popover, utilizzando la proprietà passthroughViews (anche se non lo farete qui). Dovresti quindi scartare il popover da solo.