9

Desidero presentare uno UIViewController a livello di codice che dovrebbe apparire (o meno, piuttosto) con sfondo trasparente. Lo voglio per iOS 7.0 e versioni successive. Mi sono trovato molte domande (e risposte) ma non sono state in grado di aiutarmi. Ecco la gerarchia di visualizzazione della mia app.Presenta un controller di visualizzazione modale con sfondo trasparente

Sto utilizzando un controller del menu laterale (RESIDEMenu).

Ho un rootView (base da RESIDEMenu) -> Mostra un controller Center (insieme a un controller di visualizzazione sinistro) in UINavigationController.

In requisiti, mi piacerebbe presentare un controller di vista

da un controller di vista spinta (in gerarchia di navigazione)

da un controller di vista presentato (in gerarchia di navigazione)

Inoltre, ho bisogno di presentarlo ed eseguire un'azione, e quindi rimuoverlo.

Sono abbastanza sicuro che questo dovrebbe funzionare in molti casi, con (o senza) il menu laterale, o persino il controller di navigazione.

Sto postando una domanda separata (e ovviamente anche la sua risposta) in questa coda, perché penso che sarebbe utile agli sviluppatori della community che potrebbero essere stati frustrati dalla mancanza di una soluzione accettabile a questo problema .

risposta

14

Supponiamo, siamo in FirstViewController

//Obj-C 
- (void) presentSecondVC { 
    SecondViewController *vc = [[SecondViewController alloc] init]; 
    [self addChildViewController:vc]; 
    [self didMoveToParentViewController:vc]; 
} 

//Swift 
func presentSecondVC() { 
    let vc = SecondViewController.init() 
    self.addChildViewController(vc) 
    self.didMove(toParentViewController: vc) 
} 

Alcuni di voi potrebbero avere bisogno di scrivere sopra metodo come questo,

//Obj-C 
- (void) presentSecondVC { 
    SecondViewController *vc = [[SecondViewController alloc] init]; 
    vc.view.frame = CGRectMake(0,0,width,height); //Your own CGRect 
    [self.view addSubview:vc.view]; //If you don't want to show inside a specific view 
    [self addChildViewController:vc]; 
    [self didMoveToParentViewController:vc]; 
    //for someone, may need to do this. 
    //[self.navigationController addChildViewController:vc]; 
    //[self.navigationController didMoveToParentViewController:vc]; 
} 

//Swift 
func presentSecondVC() { 
    let vc = SecondViewController.init() 
    vc.view.frame = CGRect.init(x: 0, y: 0, width: width, height: height) //Your own CGRect 
    self.view.addSubview(vc.view) //If you don't want to show inside a specific view. 
    self.addChildViewController(vc) 
    self.didMove(toParentViewController: vc) 
    //for someone, may need to do this. 
    //self.navigationController?.addChildViewController(vc) 
    //self.navigationController?.didMove(toParentViewController: vc) 
} 

Ora in SecondViewController quando vuoi tornare indietro

//Obj-C 
- (void) goBack { 
    [self removeFromParentViewController]; 
} 

//Swift 
func goBack() { 
    self.removeFromParentViewController() 
} 

Non giocare bene (con ogni scenario) :)

E sì, questo non mostrerà un'animazione, nel mio caso, sto mostrando un popup personalizzato all'interno vc se sembra bello con questo codice!

+23

A, ** Cari Downvoters **, si prega di provare a tenere presente la propria impronta qui con un commento sul motivo del vostro voto negativo. Sarebbe molto utile imparare qualcosa e migliorare me stesso. Tengo la mia risposta qui (come nella mia domanda) per aiutarti (e altri sviluppatori, potrebbe essere). Tuttavia se sembra male o non ha funzionato per te, sentiti libero di scrivere la tua parola (e se possibile anche la tua soluzione) insieme al tuo voto contrario. Lo apprezzerò sicuramente, grazie! :) – Hemang

+0

Il metodo 'goBack' è incompleto,' removeFromSuperView' dovrebbe essere chiamato. 'Riferimento alla classe UIViewController è per te. –

+0

È necessario aggiungere [self.view addSubview: vc.view]; questa linea in entrambi i casi .... solo aggiungereChildViewController non farà nulla ... –