2012-03-27 8 views
138

Il mio problema è che stavo cercando il modo di utilizzare sia lo storyboard e xib. Ma non riesco a trovare il modo corretto di caricare e mostrare lo storyboard a livello di codice. Il progetto è stato avviato con lo sviluppo di xib e ora è molto difficile annidare tutti i file xib nello storyboard. Quindi stavo cercando un modo per farlo in codice, come con alloc, init, push per viewControllers. Nel mio caso ho un solo controller nello storyboard: UITableViewController, che ha celle statiche con alcuni contenuti che voglio mostrare. Se qualcuno conosce il modo corretto di lavorare sia con lo xib che con lo storyboard senza un enorme refactoring, lo apprezzerò per qualsiasi aiuto.Come posso caricare lo storyboard a livello di codice dalla classe?

risposta

314

Nello storyboard passare all'Inspector Attributi e impostare l'identificatore del controller di visualizzazione. È quindi possibile presentare il controller di visualizzazione utilizzando il seguente codice.

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"]; 
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentViewController:vc animated:YES completion:NULL]; 
+56

'[sb instantiateInitialViewController]' è utile se si desidera avviare il controller di visualizzazione predefinito della scena. – drewish

+0

James, grazie! Ho cercato per un po 'di tempo cercando di capire come istanziare la visualizzazione di uno Storyboard. La tua risposta (e la domanda di kokoko) sono più rinfrescanti da trovare. – bejonbee

+0

Sul codice di James Beith, si deve riutilizzare UIViewControler * vc se si passa avanti e indietro con il viewcontroller corrente. Ho scoperto che il vc si aggrappa e viene collegato al pennino dello storyboard finché l'utente non preme un pulsante nella nuova vista, e ora c'è una perdita di memoria con quel vc scartato dagli incantesimi precedenti di questo codice. – SWoo

14

In attributo ispettore dare l'identificatore per tale controller vista e il codice qui sotto funziona per me

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; 
[self.navigationController pushViewController:detailViewController animated:YES]; 
3

provare questo

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"]; 

[[UIApplication sharedApplication].keyWindow setRootViewController:vc]; 
+0

Usa questo se non stai usando un UINavigationController come mostrato in altre risposte – latenitecoder

42

Swift 3

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewController(withIdentifier: "viewController") 
self.navigationController!.pushViewController(vc, animated: true) 

Swift 2

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") 
self.navigationController!.pushViewController(vc, animated: true) 

Prerequisito

Assegnare un Storyboard ID al controller della vista.

Storyboard ID

IB> Mostra l'identità ispettore> Identità> ID Storyboard

Swift (legacy)

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController 
self.navigationController!.pushViewController(vc!, animated: true) 

Edit: Swift 2 suggerito in un commento di Fred A.

+1

In Swift 2, non devi aggiungere "come? UIViewController", il compilatore lo determina automaticamente –

+2

oppure puoi semplicemente fare 'self.storyboard' e unire line1 e 2 – Honey

2

in rapida
navigationController e pushController è possibile sostituire per

present(vc, animated:true , completion: nil) 
0

Per rapido 3 e 4, si può fare questo. È buona norma impostare il nome di Storyboard uguale a StoryboardID.

enum StoryBoardName{ 
    case second = "SecondViewController" 
} 
extension UIStoryBoard{ 
    class func load(_ storyboard: StoryBoardName) -> UIViewController{ 
     return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue) 
    } 
} 

e poi si può caricare il tuo storyboard nel vostro ViewController come questo:

class MyViewController: UIViewController{ 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     guard let vc = UIStoryboard.load(.second) as? SecondViewController else {return} 
     self.present(vc, animated: true, completion: nil) 
    } 

}

Quando si crea un nuovo Storyboard sufficiente impostare lo stesso nome su StoryboardID e aggiungere il nome Storyboard in il tuo enum "StoryBoardName"

0

Puoi sempre andare direttamente al controller di root:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UIViewController *vc = [storyboard instantiateInitialViewController]; 
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentViewController:vc animated:YES completion:NULL]; 
Problemi correlati