2016-03-25 21 views
7

Ho un'app senza storyboard, tutta la creazione dell'interfaccia utente è realizzata in codice e ho ottenuto uno splitView che lo renderei utilizzabile su iPhone, perché come l'app è stata progettata inizialmente solo per iPad, quindi che quando selezioni una riga nell'elenco nella vista Master non fa nulla su iPhone ma funziona perfettamente su iPad.Crea ed esegui sequenze senza storyboard

Quindi la mia domanda è possibile creare ed eseguire il seguito che consente di mostrare la vista di dettaglio sul metodo didSelectRowAtIndexPath?

Ecco quello che ho fatto finora:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     let segue = UIStoryboardSegue(identifier: "test", source: self, destination: detailViewController!) 
     performSegueWithIdentifier("test", sender: self) 
    } 

ma durante l'esecuzione e selezionando una riga l'applicazione è stata blocca dicendogli bisogno di un performhandler così ho aggiunto questo:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     let segue = UIStoryboardSegue(identifier: "test", source: self, destination: detailViewController!, performHandler: {() -> Void in 
       let object = self.fetchedResultsController.objectAtIndexPath(indexPath) 
       let controller = self.detailViewController! 
       controller.detailItem = object 
       controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
       controller.navigationItem.leftItemsSupplementBackButton = true 


     }) 
     performSegueWithIdentifier("test", sender: self) 
    } 

e ora quando si seleziona una riga xcode si dice che non vi è alcun seguito con tale identificativo "test".

ho anche provato a chiamarla con segue.perform() e aggiungere il contenuto performHandler nella prepareForSegueMethod:

if segue.identifier == "test" { 
      if let indexPath = self.tableView.indexPathForSelectedRow { 
       let object = self.fetchedResultsController.objectAtIndexPath(indexPath) 
       let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController 
       controller.detailItem = object 
       controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
       controller.navigationItem.leftItemsSupplementBackButton = true 
      } 
     } 

e lo fa proprio niente, non va in crash, basta evidenziare la riga ho selezionato e questo è tutto

Potete aiutarmi ragazzi?

EDIT: Come ha detto Oleg Gordiichuk, non è possibile fare ciò che voglio fare a meno di storyboard, così, grazie per il suo aiuto :)

risposta

7

Segue è componente dell'interazione storyboard è possibile capire dal nome della classe UIStoryboardSegue. È una cattiva idea creare follower programmaticamente. Se non sto facendo errori, lo storyboard li crea per te.

Per risolvere il problema, provare ad utilizzare alcuni metodi comuni come semplicemente presentare ViewController.

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("id") as! MyController 
self.presentViewController(vc, animated: true, completion: nil) 

Come ho capito dalla nostra conversazione nei commenti. Ti piacerebbe creare la navigazione per tableview alla vista dettagli usando le segues senza storyboard. Per ora è impossibile farlo senza storyboard.

Per l'apprendimento futuro, provare a esaminare questo information.

+0

Grazie per la risposta, ho provato con pushViewController ed a cui subentra la vista e stava causando problemi su iPhone 6 Plus e 6S Plus in modalità orizzontale. La tua soluzione non funziona per me, perché non ho storyboard così self.storyboard restituisce sempre nil, ma ho i riferimenti dei due controller in splitView nel file AppDelegate e ancora non funziona " per presentare modally un controller attivo " – EddyW

+0

Utilizzare navigationcontroller per presentare controller di visualizzazione su di esso. –

+0

provato con: let navC = UINavigationController (rootViewController: shared.mediaListController) self.presentViewController (navC, animato: true, completamento: nil) E funziona ma non è quello che sto cercando ^^ 'voglio solo la vista di dettaglio che mostra come nell'esempio xcode della vista master/dettagli su iPhone – EddyW

0

Un modo è quello di utilizzare il metodo didSelectRow per tableView

3.x Swift

// MARK: - Navigation & Pass Data 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    print("Selected Row \(indexPath.row)") 
    let nextVC = YourNextViewController() 
    nextVC.YourLabel.text = "Passed Text" 
    nextVC.YourLabel.text = YourArray[indexPath.row] 

    // Push to next view 
    navigationController?.pushViewController(nextVC, animated: true) 
} 
Problemi correlati