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





xcode6 (7)


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).

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.




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.




Sì, usa "Mostra" invece di "Spingere"

Come posso far funzionare "show" come push? È possibile o dovrei usare "push (depricated)" invece?

Dovrebbe; lo fa per me. Sto usando Xcode 6 beta 2 e per test ho usato il modello a vista singola (chiamando il controller di visualizzazione preimpostato in IB 'VC_A'). Ho quindi aggiunto un altro controller di visualizzazione ('VC_B'). Ho quindi aggiunto un pulsante su VC_A per mostrare VC_B e un altro da VC_B a VC_A. Quando aggiungo un controller di navigazione come controller di visualizzazione iniziale nello storyboard e creo VC_A come rootViewController, sia "push" che "show" hanno lo stesso effetto. Se non ho un controller di navigazione iniziale e utilizzo 'show', ottengo quello che hai descritto in quanto il VC_B fa scorrere verso l'alto dal basso. Se provo a 'spingere', ho un crash dal momento che per poter fare push devo avere un controller di navigazione. Quindi sembrerebbe che 'show' faccia una spinta nel caso in cui sia fornito un controller di navigazione e faccia un regalo con uno stile di transizione modale se non è presente un controller di navigazione.

Dove posso trovare informazioni sui nuovi tipi di seguito?

Quindi ho trovato alcune informazioni nella sessione 'Cosa c'è di nuovo in Interface Builder' here . Se guardi le diapositive, vedrai una diapositiva (41) menzionare la modifica. Quando guardi quel video di sessione puoi saltare al minuto 38:00 dove iniziano a parlare di segui adattivi. Spiegano che il percorso adattativo "mostra", ad esempio, tiene conto del contesto al momento di decidere come eseguire la presentazione di un nuovo controller di visualizzazione.




Questo sta ancora accadendo in iOS 10.x

Cancellare e ripristinare i segues non ha risolto nulla per me:

Problema: la funzionalità Requred era di 7 segui che funzionano solo come "push" (in realtà un dettaglio dello show) ma in realtà solo i primi passaggi che ho aggiunto avrebbero spinto, gli altri si sarebbero comportati tutti in modo modale. Ciò nonostante nonostante Interface Builder descriva identicamente ciascuno dei segues.

Soluzione: ho dovuto aggiungere l'azione ai 6 segui che non ce l'hanno.

XML Storyboard originale

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" id="3NK-93-wTy"/>
</connections>

Ho cambiato questo aggiungendo showViewController: mittente

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" action="showViewController:sender:" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" action="showViewController:sender:" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" action="showViewController:sender:" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" action="showViewController:sender:" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" action="showViewController:sender:" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" action="showViewController:sender:" id="3NK-93-wTy"/>
</connections>



TLDR; Elimina la Segue che non spinge correttamente e ricreala nello storyboard trascinando da un UIView / UIControl al controller della vista di destinazione.

Non c'è niente di sbagliato nelle altre risposte, ma questo spiega cosa sta succedendo, come è possibile verificare che stia accadendo e come mitigare il problema in futuro.

sfondo

Nel mio caso, nessuno dei miei Show Segues funzionava anche se avevo già un UINavigationController come controller di visualizzazione iniziale (con il mio contenuto UIViewController come root).

Perché e come lo spettacolo segna le pause

Lo Show segue si interrompe quando ha un'azione associata al seguito all'interno dell'XML di origine dello storyboard. Un tipico scenario che potrebbe causare questo potrebbe essere se hai ridefinito un seguito da un passaggio manuale precedentemente chiamato nel codice. Questo lascia i seguenti bit nello storyboard xml.

<connections>
    <segue destination="85t-Z1-hxf" kind="show" identifier="ToOptions" action="showDetailViewController:sender:" id="gdZ-IX-KcN">
</connections>

Nota Bene Per visualizzare lo storyboard come xml; Fai clic con il tasto destro sul file storyboard e scegli Apri come> Codice sorgente . Per ripristinare l'uso Apri come> Generatore di interfacce - Storyboard

Per adattare le azioni personalizzate quando si utilizza il seguito dallo storyboard, è sufficiente toccare prepareForSegue e intercettare il controller della vista di destinazione e chiamare qualsiasi metodo da quella posizione. In ogni caso, l'effetto collaterale di questo piccolo bug (il bug è il fatto che quando si ridefinisce il seguito non è configurato correttamente in xml ~ cioè l'azione rimane anche dopo aver cambiato il seguito in uno che opera da un UIView (o UIControl) a un controller di visualizzazione di destinazione).

Sfortunatamente la soluzione più diretta fallisce. Quindi, rimuovere l'attributo xml per l'azione dallo Storyboard NON risolverà il problema. Invece si deve semplicemente cancellare e ricreare i passaggi nello storyboard.

Quando ricreato, lo xml dello storyboard non avrà più un'azione associata al particolare seguito e lo Show verrà eseguito come Push.

Esempio di Xml per il corretto Show Segue

  <connections>
    <segue destination="RbV-Au-WV9" kind="show" identifier="ToOptions" id="5dm-os-bcS"/>
  </connections>

attenuazione

Per prevenire le recidive, è sufficiente attenersi ai seguiti dello storyboard non manuale, se possibile, utilizzando prepareForSegue per aggiungere azioni richieste in base al controller della vista di destinazione. Oppure, se devi mescolare e abbinare, prendi la precauzione per verificare che il tuo seguito non abbia alcuna azione allegata nello xml dello storyboard. Se hai a che fare con progetti precedenti, dovresti prestare particolare attenzione al codice sorgente di Storyboard poiché ho scoperto alcuni problemi.




So di essere in ritardo per questo, ma ho voluto condividere ciò che ho imparato. Questo è in effetti un bug ed è ancora presente oggi (2014-12-18).

Ho scritto un articolo su questo here .

È facilmente riproducibile; su iOS8 funzionerà bene e anche su iOS7.x finché non si spinge programmaticamente un controller di visualizzazione nello stack prima di chiamare Show segue.

Se si spinge in pila solo usando le connessioni dello storyboard, funzionerà; ma a quanto pare se si spinge via codice in qualche modo la proprietà navigationController del push UIViewController sarà nil e quando si chiama Show , assumerà la sua modale perché non c'è navigazione per controllare lo stack.

Solo il workaround finora non è push tramite codice (non fattibile) o usa il Push ora deprecato.

Ho archiviato un radar (link sull'articolo). Sentiti libero di archiviare i duplicati con la speranza che Apple risolva questo problema.




Il nostro team attualmente fa esattamente questo. Ogni sviluppatore ha il seguente:

  1. Git installato sul loro computer locale
  2. Accesso alla propria unità condivisa personale ( L:
  3. Accesso a un'unità di gruppo condivisa ( V: :)

Abbiamo il repository "remoto" (configurato con init -bare ) sul V: drive, e ognuno ha un clone sulla sua L: drive personale. Tutte le modifiche vengono apportate alla L: drive e spinte fino alla V: drive, che vengono poi tirate giù in seguito dagli altri sviluppatori ai loro rispettivi repository personali sulle loro L: drives. Funziona senza problemi e attenua la necessità di un server Git.





storyboard push ios8 xcode6