2013-07-25 18 views
19

Sto spingendo a un nuovo controller di visualizzazione e passando alcuni dati ad esso. Quando eseguo l'applicazione, posso premere il pulsante e passare a una nuova vista, ma lo schermo è completamente nero. Qualsiasi aiuto è apprezzato.Push View Controller, Black Screen

- (IBAction)button:(id)sender { 

    NSString *firstField = self.field.text; 
    NSString *secondField = self.field2.text; 

    self.resultsArray = [[NSArray alloc] initWithObjects:firstField, secondField, nil]; 

    NSUInteger randomResult = arc4random_uniform(self.resultsArray.count); 
    self.label.text = [self.resultsArray objectAtIndex:randomResult]; 

    ImagesViewController *ivc = [[ImagesViewController alloc] init]; 
    ivc.label = self.label.text; 
    [self.navigationController pushViewController:ivc animated:YES]; 

} 
+0

qual è il contesto di questa? stai allocando il controller di visualizzazione dallo storyboard? un file xib? niente di niente solo in modo casuale? –

risposta

0

In genere, la transizione ad un altro controller di vista chiamando:

initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 

sulla vostra abitudine UIViewController.

Se non stai utilizzando un file xib, allora quello che stai facendo potrebbe andare bene. Stai creando dinamicamente i tuoi elementi dell'interfaccia utente all'interno del costruttore di ImagesViewController?

+0

Non ho uno xib. Sto creando gli elementi dell'interfaccia utente dallo storyboard. –

+0

In questo caso, probabilmente si desidera utilizzare questo metodo per gestire la transizione della vista: - (void) performSegueWithIdentifier: (NSString *) identificatore mittente: (id) mittente –

2

Il controller di visualizzazione che si sta spingendo non ha alcuna dimensione di frame impostata. Si consiglia sempre di chiamare init designato per gli oggetti. Per controller di vista, il metodo init designato è

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 

se si dispone di un xib assegnarlo come

ImagesViewController *ivc = [[ImagesViewController alloc] initWithNibName:<your xib> bundle:[NSBundle mainbundle]; 

se si utilizza visualizzazione personalizzata, assegnare una dimensione fotogramma e inserirlo come visualizzazione secondaria

47

Quando si utilizza uno storyboard e si desidera inserire un controller di visualizzazione nel codice (piuttosto che in un seguito), è necessario fornire al controller un identificatore e crearlo in questo modo:

ImagesViewController *ivc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyIdentifier"]; 
    ivc.label = self.label.text; 
    [self.navigationController pushViewController:ivc animated:YES]; 
+0

L'oggetto storyboard può essere recuperato con '[UIStoryboard StoryboardWithName: @ "Main" bundle: nil]; dove "Main" è il nome del file storyboard senza l'estensione (quindi potrebbe anche essere "Main_iPhone" o "Main_iPad"). –

+0

@BrianWhite, true, ma se il controller chiamante si trova nello stesso storyboard del nuovo controller, è più breve utilizzare solo self.storyboard. – rdelmar

+0

Sicuro. Stavo cercando di accedervi da AppDelegate che non aveva quella proprietà e quindi ho dovuto fare qualche ricerca in più. Ho pensato di aggiungere quello che ho imparato in modo che altri potessero evitare il lavoro extra se cercassero di fare lo stesso. –

1

Ciò può anche accadere se in qualche modo si ha una connessione errata tra una delle visualizzazioni secondarie nello storyboard alla vista del controllore. Controlla che le prese di riferimento siano corrette in ciascuna delle tue sottoview.

2

Xcode 7.3 e Swift 2.2

Nel mio caso, avevo fatto i cambiamenti nello storyboard e ne ha fatto un TabBarController e di conseguenza cambiato la classe del controller dal UIViewController a UITabBarController. Dopo alcuni aggiustamenti, questo cambiamento non è stato favorevole e ho annullato tutte le modifiche e ottenuto una schermata nera, perché avevo dimenticato di cambiare la classe del controller. Ho cambiato di nuovo in UIViewController e ha iniziato a funzionare di nuovo.

Quindi controllare se si è commesso lo stesso errore. Lo schermo nero è venuto perché lo storyboard aveva una classe (UIView/UITabBar/UITableView Controller) ma non era lo stesso nel codice.

1

Ho avuto una buona:

Assicurarsi si implementa la classe Super destra, delegato, ecc .. nella parte superiore della viewController si sta tentando di presentare. cioè

non ero utilizzando/attuazione UINavigationController affatto

class TMDetailBlogViewController: UINavigationController { 
    //code goes here 
} 

Dopo

class TMDetailBlogViewController: UIViewController { 
    //code goes here 
} 
Problemi correlati