Domanda

Un saluto! Ho un'app per iPhone funzionante (huzzah!) Che utilizza un MainView.xib contenente un UITabBar completamente fornito con diversi oggetti UINavigationController e -la-ready.

Ora mi è stato chiesto di aggiungere una vista di registrazione unica a questo mix. Questa vista sembrerebbe prima la UITabBar all'avvio dell'app, ottenere alcune informazioni dall'utente, registrarsi con un server - o verificare la presenza di una registrazione esistente, quindi eliminare alcuni dati nel portachiavi. (Se il portachiavi mostra già la prova della registrazione, saltiamo la visualizzazione di questa particolare vista.)

La parte relativa alla registrazione e al portachiavi che ho sotto controllo ( grazie Erica Sadun per quest'ultima! ), ma mostrando che la vista una tantum iniziale si sta rivelando più complicata di quanto mi aspettassi.

Sospetto di essere troppo vicino al problema per vedere cosa c'è che non va. Spero davvero che sia un errore pilota e che non richieda nulla di troppo Rube Goldberg!

Ecco lo scenario:

L'app inizia caricando MainView.xib , in cui si trova il suddetto controller UITabBar , et. al. Per ragioni di argomento, supponiamo che dobbiamo mostrare quella vista di registrazione. Inoltre, vorremmo che avesse un aspetto modale, quindi volerà dal basso verso l'alto. Quindi, quando abbiamo finito, possiamo licenziarlo, chiamare un delegato (molto probabilmente il delegato dell'app) e dirgli di proseguire con l'originale UITabBar .

// Normally, the Tab Bar Controller's view is added to the window ... still do this?
[window addSubview:tabBarController.view];

// We could now set up a VC like so. Mostly harmless. (I know, "mvc" is an unfortunate abbreviation in this case.)
RegistrationVC *mvc = [[RegistrationVC alloc] initWithNibName:@"RegistrationView" bundle:nil];

Nota che RegistrationView.xib contiene un UIView , ma nessun controller di navigazione. Vogliamo tenerlo disaccoppiato in modo che possa essere riutilizzato, ad esempio, come parte del controller di navigazione di un elemento della barra delle schede (per rivedere le informazioni di registrazione, ad esempio).

Andando avanti. Creiamo un controller di navigazione con l'intento di presentare le cose in modo modale:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:mvc];

Presentiamo quindi il nostro VC modale, usando come base il controller della barra delle schede e rilasciando i bit allocati.

[tabBarController presentModalViewController:nc animated:YES];
[nc release];
[mvc release];

Prima osservazione. Qualcosa mi dice che questo è semplicemente sciatto. Puoi vedere la prima barra di navigazione dell'elemento della barra delle schede e la vista appare proprio mentre la vista modale si avvia. Yeccch! Inoltre, provare a impostare il VC selezionato su zero in anticipo non ha alcun effetto:

 tabBarController.selectedViewController = nil;

In realtà non vogliamo / non dobbiamo usare la barra delle schede fino a quando dopo il VC modale è terminato (e abbiamo il delegato che ci aiuta a farci sapere quando ciò accade).

Perché mi preoccupo anche della barra delle schede? Beh, sembra che ho bisogno di qualcosa per appendere quel cappello modale di VC e non so cos'altro c'è da usare.

È l'unico modo? Sembra solo collegare inutilmente la registrazione VC e la barra delle schede, e ha solo un odore ... sbagliato.

Indizi benvenuti / apprezzati!

È stato utile?

Soluzione

È difficile rispondere a questa domanda senza sapere cosa mostra Default.png. Supponendo che tu stia seguendo l'HIG e visualizzi una tabBarController vuota, suggerirei una stratificazione piuttosto complicata: vista dal basso: tabBarController.view vista centrale: UIImageView: Default.png vista dall'alto: vista di registrazione posizionata sotto la parte inferiore dello schermo

All'avvio, se è necessario mostrare la vista di registrazione, animarla manualmente verso l'alto e, una volta eseguita l'animazione, rimuovere UIImageView sotto di essa. Al termine della registrazione, animare manualmente la vista di registrazione verso il basso per rivelare tabBarController. Se all'avvio non è necessaria la vista di registrazione, basta animare UIImageView per svanire (o semplicemente rimuoverlo).

Mano OTOH, se non stai seguendo l'HIG e invece stai mostrando una sorta di schermata iniziale, le cose diventano un po 'più facili. Strato in questo modo: vista dal basso: tabBarController.view vista dall'alto: UIImageView: Default.png

Se è necessario mostrare la registrazione, presentare presentModalViewController con animato: NO e quindi sfumare UIImageView. In caso contrario, basta dissolvere UIImageView.

Questa è una lunga spiegazione senza immagini, spero abbia senso. Il punto saliente è che sto suggerendo di aggiungere un UIImageView: Default.png per essere la prima cosa che viene visualizzata all'avvio dell'app e utilizzarla per guidare la tua transizione in registrazione o tabBarController come appropriato.

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