Domanda

La premessa è molto semplice:. Voglio visualizzare una vista modale in un app iPad che utilizza un UISplitViewController

La gerarchia vista è straight-forward:

                                              /- TableViewController1
                     /- root:TabBarController -- TableViewController2
SplitViewController -
                     \- detail:CustomViewController

Quando clicco su una delle celle della tabella in TableViewController1, apro una vista modale:

- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)ip {
  UIViewController *vc = [[MyModalClass alloc] init];
  UINavigationController *nc = [[UINavigationController alloc]
                                initWithRootViewController:vc];
  nc.modalPresentationStyle = UIModalPresentationFormSheet;
  nc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
  [self presentModalViewController:nc animated:true];
  [nc release];
  [vc release];
}

Questo funziona bene: le appare vista. I problemi iniziano quando provo a respingerlo in qualsiasi orientamento diverso paesaggio.

Nel ModalViewController, il seguente metodo viene attivato da un UITabBarButton nella barra di navigazione:

- (void) closeButtonInNavBarWasClicked:(id)sender {
  [self dismissModalViewControllerAnimated:true];
}

E questo è dove iniziano i problemi.

Quando questo codice viene chiamato, la vista modale scompare, ma: il TabBarController (vista radice della vista split) è improvvisamente ruotata e ridimensionata. Il contenuto è improvvisamente lateralmente, e copre parzialmente la vista dettagli. I dati di vista non è ridimensionata per essere più piccolo, è solo parzialmente coperto dalla vista radice.

L'unica situazione in cui questo problema non viene visualizzato è quando io batto sulla cella TableViewController1 quando l'applicazione è in modalità verticale. Nonostante la vista di base essendo in una popover (che potrebbe essere una ampia fonte di errori), tutto funziona correttamente.

Alcune cose che ho già provato, senza successo:

  • Dump la barra delle schede, visualizza solo TableViewController1 come il controller principale della visualizzazione di divisione
  • Creare un protocollo delegato in modo che il genitore TableViewController1 respinge la vista modale piuttosto che gli MyModalClass stessa vista.
  • Presentazione / respinge il vista modale su TableViewController1.splitViewController in realtà rende le cose peggiori:. La vista non appare nemmeno
  • Sacrificare diverse capre inoltre non ha aiutato.

I sarebbe enormemente apprezzare qualsiasi input su questo tema.

È stato utile?

Soluzione

Ho una specie-of-risposta alla mia domanda: ho usato strumenti per eliminare sistematicamente tutte le perdite di memoria nella mia app. Una volta che lo avessi fatto, il problema scomparve.

Altri suggerimenti

Ho avuto lo stesso problema come voi, ho risolto da programatically temporaneamente la forza ruotare la mia presentazione viewController (una volta tornato ad esso), nel suo metodo viewDidAppear ad una certa rotazione arbitraria. Naturalmente senza animazione. E quindi ruotato di nuovo l'orientamento desiderato (che ho salvato nella prima della rotazione).

Quindi, se viene visualizzato VC1 VC2 modale, e la rotazione utente VC2 ho impostato l'orientamento VC1 secondo orientamento corrente VC2 chiamando: UIInterfaceOrientation currentOrientation = self.interfaceOrientation; // negozio orientamento attuale VC2 (vista modale) [VC1 willRotateToInterfaceOrientation: Durata currentOrientation: 0];

Poi ho VC2 dissmiss e in viewWillAppear di VC1 faccio questo:

- (void) viewDidAppear: (BOOL) animato {

[super viewDidAppear:animated];

/* Store wanted orientation */
UIInterfaceOrientation currentOrientation = self.interfaceOrientation; 

/* rotate to some arbitrary orientation, this solves the bug. */
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortraitUpsideDown animated:NO]; 

[[UIDevice currentDevice] setOrientation:currentOrientation animated:NO]; //restore wanted orientation.

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top