Sequenza adattiva nello storyboard Xcode 6. Il push è deprecato?


Answers

C'è già una risposta accettata, ma volevo dare un po 'più di informazioni, possibilmente informazioni che prima non erano disponibili.

Come accennato in precedenza, i successi "push" e "modal" erano deprecati e sono stati sostituiti rispettivamente da "show" e "present modally". Secondo la documentazione di Apple, i nuovi segui sono stati ulteriormente suddivisi in segui che si adattano alle classi di dimensioni. I più vecchi dovrebbero essere utilizzati solo per supportare versioni iOS precedenti a iOS 8.

Il documento nel seguente link spiega questo e la descrizione di tutti i segui disponibili, vecchi e nuovi.

Aggiunta di un segmento tra le scene in uno storyboard

Nel caso in cui l'URL cambi in futuro, questa è la spiegazione fornita per ogni nuovo passaggio:

Mostrare

Presentare il contenuto nel dettaglio o nell'area principale a seconda del contenuto dello schermo. Se l'app visualizza una vista principale e di dettaglio, il contenuto viene inserito nell'area dei dettagli. Se l'app visualizza solo il master o i dettagli, il contenuto viene inserito nella parte superiore dello stack del controller di visualizzazione corrente.

Mostra i dettagli

Presenta il contenuto nell'area dei dettagli. Se l'app visualizza una vista principale e di dettaglio, il nuovo contenuto sostituisce il dettaglio corrente. Se l'app visualizza solo il master o il dettaglio, il contenuto sostituisce la parte superiore dello stack del controller di visualizzazione corrente.

Presente Modalmente

Presenta il contenuto in modo modale. Ci sono opzioni per scegliere uno stile di presentazione (UIModalPresentationStyle) e uno stile di transizione (UIModalTransitionStyle).

Presente come Popover

Presenta il contenuto come un popover ancorato a una vista esistente. C'è un'opzione per specificare le possibili direzioni della freccia mostrata su un lato della vista popover (UIPopoverArrowDirection). C'è anche un'opzione per specificare la vista di ancoraggio.

Question

Il costruttore di interfacce Xcode 6 ha di default una nuova casella di controllo "usa classi di dimensioni". Rende le visualizzazioni adattive.

Quando provo a creare sequenze tra 2 visualizzazioni nello storyboard, ho nuove opzioni:

invece vecchio:

Ora abbiamo "show" e "present modally" invece di "push" e "modal". Le vecchie opzioni sono contrassegnate come deprecate. Ho scelto l'opzione "mostra", perché nelle impostazioni successive ha chiamato "show (ad esempio push)

Ma non fa push. L'animazione Segue appare come una diapositiva dal basso (modale) e la barra di navigazione scompare.

La domanda è: come posso fare "mostrare" il lavoro come spingere? È possibile o dovrei usare "push (deprecato)" invece? Dove posso trovare informazioni sui nuovi tipi di seguito? L'unica cosa che ho trovato nella libreria di sviluppatori di iOS8 è Storyboards: ti aiuta a progettare la tua interfaccia utente ma non ci sono informazioni su "mostra".

AGGIORNARE

Ho provato a creare un nuovo progetto e "show" funziona davvero come "push". Penso che il problema nel mio progetto possa essere dovuto al riutilizzo del controller di navigazione con codice come questo, ma non so come risolverlo.

if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
    SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;

    swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {

        UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
        [navController setViewControllers: @[dvc] animated: NO ];
        [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
    };

}

Dopo di che provo a spingere NewViewController dopo MainViewController

AGGIORNAMENTO 2:

Mi sembra di essere solo iOS 7, iOS 7.1.




Ho avuto lo stesso problema con segues in Xcode 7 e iOS 7.1.2. Show segues (nuova funzionalità di iOS 8) funziona come segue modali in iOS 7 e non ti consente di spingere i tuoi View Controller nello stack di Navigation Controller quando definisci il tipo di follow con Xcode nello Storyboard. Questo è il motivo per cui il tuo self.navigationController tornerà nullo, perché il View Controller non è stato inserito nello stack e non è possibile eseguirlo.

Non capisco perché Apple non abbia aggiunto notifiche per questo caso in Xcode quando hai bisogno che la tua app funzioni su iOS 7. Dicono che il metodo Push è deprecato, ma Show non funziona correttamente con iOS 7.

Cosa ho fatto per risolvere il problema:

Ho creato la classe MYShowSegue con .h

#import <UIKit/UIKit.h>

@interface MYShowSegue : UIStoryboardSegue

@end

E il file .m con un solo metodo di esecuzione :

#import "MYShowSegue.h"

@implementation MYShowSegue

- (void) perform {

    if ([[[self sourceViewController] navigationController] respondsToSelector:@selector(showViewController:sender:)]) {

        id sender = nil;
        [[[self sourceViewController] navigationController] showViewController:[self destinationViewController] sender:sender];
    }else{

        [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:YES];
    }
}

@end

Di quanto tu abbia bisogno di impostare un tipo personalizzato per ciascun seguito nello Storyboard e selezionare una nuova classe per esso, nel mio caso era MYShowSegue.

Esempio di Segmento personalizzato

Questa soluzione ti aiuterà a ottenere il pieno supporto delle tue app iOS 7, useranno il metodo pushViewController per spingere le tue Views e per iOS 8,9 ecc. I tuoi passi funzioneranno con il nuovo metodo (iOS 8) showViewController

Non dimenticare di fare lo stesso con tutti i tuoi seguiti nello Storyboard.




Come ha commentato Scott Robertson , sembra un bug in iOS 7.

Sembra che in iOS 8 la transizione sia dedotta in fase di esecuzione (comportamento corretto), mentre in iOS 7 la transizione viene dedotta in fase di progettazione (comportamento buggy).

La soluzione più semplice consiste nell'aggiungere un controller di navigazione inutilizzato allo storyboard e collegarlo in modo che il controller di visualizzazione in questione faccia parte di questo controller di navigazione. In realtà non è necessario istanziare il controller di navigazione, è sufficiente il controller di visualizzazione buggy per sapere che è incorporato in un controller di navigazione.

Nota: la simulazione di una barra di navigazione non è sufficiente per questi scopi; è necessario disporre effettivamente di un controller di navigazione nel proprio stack di push.

Per riprodurre il bug:

  1. Crea un nuovo storyboard che utilizza classi di dimensioni.
  2. Creare un controller a due viste (nessun controller di navigazione).
  3. Fare in modo che il primo controllore di vista mostri il secondo controllore di vista tramite una sequenza di Show (ad es. Push) collegata ad un pulsante, ad esempio.
  4. Nel codice, mostra il primo controller della vista, ma incorporalo in un controller di navigazione tramite initWithRootViewController: method.
  5. Esegui l'app su iOS 7.
  6. Tocca il pulsante che dovrebbe eseguire la spinta.
  7. Avrai una transizione modale invece di una spinta su iOS 7. Su iOS 8 otterrai il comportamento corretto, push.

Per correggere il bug:

  1. Aggiungi un controller di navigazione allo storyboard e imposta il primo controller di visualizzazione come controller della vista radice. (Nota: aggiungendo il secondo come controller della vista radice NON risolverà questo bug).
  2. Dagli un identificatore di posta indesiderata per sopprimere l'avviso che il controller di navigazione è inaccessibile e per documentarti che esiste solo come soluzione alternativa. (ad es. workaround for show segues in iOS 7 ).

Si noti come il controller di navigazione è stato aggiunto nella seconda immagine e come non ha alcuna freccia in entrata (cioè non c'è modo di creare un'istanza diversa dall'uso del suo identificatore del controller di vista).




Related