Chiamate non bilanciate per iniziare / terminare le transizioni di presenza per <FirstViewController: 0x2a2c00>


93

Ho questo problema quando simulo la mia app, non è un errore o un avviso ma appare nella mia console, qualcuno l'ha mai sperimentato prima?


fai qualche tipo di animazione in quel controller di visualizzazione?

1
Sì. Ho un'animazione di apertura che scorre in immagini separate, ora ho notato che questo errore si verifica solo quando sto caricando il codice sul telefono.
C.Johns

il messaggio di errore suggerisce di iniziare una transizione ma manca una chiamata al metodo di fine corrispondente.

1
Ho la stessa cosa. Qualche soluzione per questo?
seeafish

Anche cercando una soluzione a questo
barfoon

Risposte:


48

Nel mio caso, questo errore si verifica quando fai clic su due schede in una visualizzazione tabella molto velocemente.

Il risultato causa il nome del titolo errato e il pulsante Indietro scompare. Qualcuno ha detto che quando si spinge una vista set animated:NO,. L'errore scomparirà ma causerà comunque uno strano comportamento. Spinge due visualizzazioni, quindi è necessario tornare indietro due volte per tornare alla schermata di visualizzazione della tabella.

Metodo che ho provato per risolvere questo problema:

Inserisci BOOL cellSelected;

nel viewWillAppear cellSelected = YES;

in didselectcell delegate if (cellSelected){cellSelected = NO; do action ; }

Ciò aiuta a evitare di fare clic su due celle diverse molto velocemente.


5
La mia ipotesi è che alcune delle parole fossero difficili da capire. Ho apportato alcune modifiche per aumentare la leggibilità.
Kyle Clegg

42

Nel mio caso è successo quando ho attivato il trigger [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];all'interno UINavigationControllerdel viewDidLoadmetodo di un articolo .

Il passaggio al viewDidAppearmetodo ha risolto il problema.

La ragione molto probabile è che viewDidLoadnon tutte le fantasiose animazioni sono già state completate, mentre in viewDidAppeartutto è stato fatto.


Grazie. Mi ero perso nell'era degli uomini delle caverne dove stavo creando ogni singolo elemento dell'interfaccia utente attraverso il codice. Le cose dello storyboard sono nuove per me.
Kiran Kulkarni


15

Dovresti eseguire il codice in un ciclo diverso per evitare ciò

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });

7
Un'idea migliore è racchiudere l'animazione di presentazione in una dispatch_asynccoda principale. Il dispatch_asyncproblema è che attende fino a quando tutte le altre animazioni sulla coda principale sono state completate. è molto meglio che usare un ritardo perché: 1- non saprai mai se un ritardo è sufficiente, dipende dal tuo dispositivo host 2- finirai per esagerare con il ritardo e qualcosa andrà in ritardo. prova questo:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani

12

Ho avuto molti problemi con lo stesso problema. L'ho risolto in questo modo

1) Non stai utilizzando l' UIViewController'sinizializzatore designato initWithNibName:bundle:. Prova a usarlo invece di solo init.

2) impostato animated:YESsu NO e questo ha risolto il problema. per esempio.[self.navigationController pushViewController: viewController_Obj animated:NO];


7

Ho avuto lo stesso problema usando il controller di navigazione e spingendo altri controller ad esso. Ho provato a utilizzare Buffered Navigation Controller e molti altri approcci, ma non ha funzionato per me. Dopo aver speso un po 'di tempo per capirlo, ho notato che questo problema si verifica se si tenta di spingere il nuovo controller di visualizzazione mentre la transazione precedente (animazione) è in corso (circa 0,5 secondi di durata immagino). Ad ogni modo, ho fatto una soluzione rapida delegando il controller di navigazione e aspettando la fine dell'animazione precedente.


Grazie! Spostare la mia logica in viewDidAppear ha aiutato nella mia situazione.
Jaroslav

7

Assicurati di non dimenticare di in -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear per chiamare il super metodo appropriato nel tuo sovraccarico di quei metodi. Ad esempio, nel mio caso il nome del metodo non corrisponde in questo modo:

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

notare che i metodi di visualizzazione e di scomparsa non corrispondono


Ho appena trascorso circa due ore a eseguire il debug di questo problema e questo è quello che si è scoperto. Chiamando super.viewWillAppear()dentro viewDidDisappear().
Daniel Wood,

Grazie per questo suggerimento. Non era il mio unico problema, ma mi ha aiutato!
Anthony C

4

"Chiamate sbilanciate per iniziare / terminare le transizioni di presenza per"

Dice che un'animazione viene avviata prima che l'ultima animazione correlata non venga completata. Quindi, stai aprendo un controller di visualizzazione prima di spingere quello nuovo? O potrebbe scoppiare alla radice? se sì, prova a farlo senza animazione, ad es[self.navigationController popToRootViewControllerAnimated:NO];

E vedi se questo risolve il problema, nel mio caso questo ha funzionato.


1
Questa è la chiave: pop o cambia altre transizioni del viewcontroller allo stesso tempo.
Rocky

2

Ho riscontrato questo problema perché stavo chiamando un UIPrintInteractionController da un viewController senza UITabbar e né UINavigationBar. Sembra che UIPrintInteractionController non abbia ottenuto il printInteractionControllerParentViewController corretto. L'implementazione del metodo nel delegato e la restituzione dell'attuale rootViewController ha funzionato per me.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;

2

Ho avuto un problema simile che riguardava il riavvolgimento delle finestre di dialogo modali. Ha pubblicato la soluzione qui ...

https://stackoverflow.com/a/38795258/324479

[Problema]

Nav Controller -> VC1 -Push -> VC2 -PopOver o Modal Segue -> VC3.

VC3 sta tornando a VC1.

Quando il Segue da VC2 a VC3 è PopOver e Modal, lo svolgimento termina con un avviso: chiamate sbilanciate per iniziare / terminare le transizioni di comparsa per UIViewController "

Se il Segue da VC a VC è premuto, l'avviso scompare.

[Soluzione]

Sarebbe fantastico se la logica di svolgimento si occupasse di questo. Forse è un bug, forse no. In ogni caso, la soluzione è rendere VC2 (il controller che ha il popup) l'obiettivo del riavvolgimento, quindi attendere che finisca di apparire prima di far apparire il controller di navigazione. Ciò garantisce che l'animazione di riavvolgimento (popup inverso) abbia tempo sufficiente per terminare prima di tornare indietro. Anche con le animazioni disattivate, deve ancora attendere altrimenti si ottiene l'errore.

Il codice per VC2 dovrebbe essere il seguente. (Swift)

class VC2: UIViewController {
    private var unwind = false
    @IBAction func unwindToVC1(segue:UIStoryboardSegue) {
        unwind = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        if unwind {
            self.navigationController?.popViewControllerAnimated(false)
        }
    }
}

1

La situazione può verificarsi se si aggiunge una vista con un controller di visualizzazione modale come vista secondaria. Meglio usare:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

In pratica sta dicendo che il ciclo di vita della vista non è ottimizzato per quei viewController che stai cercando di visualizzare in quel momento.


1

Ho il problema simile quando provo a fare:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

in una funzione come - (void) popUpToLevelTwo;, e mettere return;a alla fine della funzione risolve il problema


1

Ho anche ricevuto questo a

[self dismissModalViewControllerAnimated:YES];

Ho cambiato YESin a NOe questo ha risolto il problema.


1

Ho lo stesso problema quando ho usato il metodo pop di navigationcontroller Nella mia app utilizzo una logica separata per il controller di navigazione, quindi ho evitato l'uso della barra di navigazione ed è sempre nascosto. Quindi utilizzo una visualizzazione personalizzata e una notifica per gestire il pulsante Indietro e i suoi eventi. gli osservatori di notifica vengono registrati e non rimossi. Quindi la notifica si attiva due volte e crea l'errore sopra menzionato. Controlla attentamente il tuo codice per ottenere tali errori


1

Per quello che vale, ho ricevuto lo stesso errore quando non includevo una chiamata a [super viewDidLoad:animated]nel mio viewDidLoadoverride.


1
forse intendi viewDidAppear? viewDidLoad non ha parametri
Fabio Napodano

1

Ho anche avuto questo problema quando ho toccato un pulsante da un pennino. Si scopre che avevo accidentalmente cablato il pulsante per inviare un evento a due metodi IBAction, ognuno dei quali ha eseguito un pushViewController: animato:


Grazie !! mi risparmi tempo !!
VD

1

Ho implementato una logica per aspettare che spinga UIViewControllerfino a quando tutti i dati sono stati scaricati. Si è verificato un errore in questa logica che ha causato il push UIViewControllertroppo presto mentre era ancora in corso un'altra chiamata API.

Ha fatto sì che lo stesso UIViewControllerfosse spinto due volte da UINavigationControllere ha dato questo avvertimento.


1

Motivo Per messaggio: Questo messaggio ottiene visualizzato se e solo se si sta spingendo / presentare un altro controller Vista da viewWillAppear, loadView, inito viewDidLoadil metodo della corrente di controllo View

Modo per rimuovere il messaggio di errore: spostare il codice di invio / presentazione sul viewDidAppearmetodo risolverà il problema


1

Swift 4

Il mio problema era che stavo presentando un altro VC prima che il mio attuale finisse di essere renderizzato.

La soluzione era presentare il mio prossimoVC dopo un breve ritardo.

COSA NON DEVI FARE

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

COSA DOVRESTI FARE

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}

1
Invece di usare un ritardo, metterei il codice in viewDidAppear o viewDidLayoutSubviews.
Pranav Kasetti

0

Ho avuto questo problema quando ho dimenticato di impostare Break; dopo aver premuto la vista in un'istruzione switch!

Come qui:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:

0

il motivo dell'errore "Chiamate sbilanciate per iniziare / terminare le transizioni di aspetto" è quando si naviga | segue due volte allo stesso tempo


0

una soluzione sarebbe,

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];

0

Puoi imbatterti in questo se provi a chiudere un UIViewController prima che abbia terminato il caricamento.

Avevo questo messaggio nella console e mi stavo concentrando interamente sull'UIViewController che presentava il nuovo UIViewController, senza successo. Alla fine ho scoperto che il problema era nell'UIViewController che stavo presentando si chiudeva da solo perché l'utente non aveva effettuato l'accesso al proprio account.

Spero che questo aiuti qualcuno.


0

Questa è stata dura per me: l'ho ignorata

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

senza sovrascrivere:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

nel mio controller di navigazione root della finestra. quindi un controller di navigazione figlio si è lamentato quando spingeva un altro controller di visualizzazione con l'avvertimento di cui sopra. L'avvertimento non era il peggiore, il grosso problema era che lì il delegato del controller di navigazione figlio non veniva più chiamato. weired.


0

Nel mio caso mi è stato andare a prendere NSDatada NSURLdentro ' viewDidLoad' metodo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.