2016-03-25 16 views
7

Ich habe eine App ohne Storyboards, alle UI-Erstellung ist in Code gemacht und ich habe eine splitView, die ich es auf dem iPhone nutzbar machen würde, weil als App zuerst für iPad nur so konzipiert wurde Wenn Sie eine Zeile in der Liste in der Master-Ansicht auswählen, tut dies nichts auf dem iPhone, funktioniert aber auf dem iPad einwandfrei.Erstellen und Durchführen von Übergängen ohne Storyboards

Also meine Frage ist, kann ich erstellen und führen Sie die Überleitung, die die Detailansicht auf der didSelectRowAtIndexPath Methode anzeigen lassen können?

Hier ist, was ich bisher getan habe:

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

aber beim Laufen und die Auswahl einer Zeile die App abstürzt wurde es erzählt eine performhandler benötigt, so kann ich diese hinzugefügt:

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) 
    } 

und jetzt wenn eine Zeile ausgewählt wird, sagt xcode, dass es keinen Übergang mit einer solchen Kennung "test" gibt.

Ich habe auch versucht, es durch segue.perform() zu nennen und den performHandler Inhalt in die prepareForSegueMethod hinzufügen:

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 
      } 
     } 

und es tut einfach nichts, nicht abstürzt, markieren Sie einfach die Zeile i ausgewählt und das ist alles

Können Sie mir helfen?

EDIT: Wie Oleg Gordiichuk sagte, ist es nicht möglich, zu tun, was ich ohne Storyboards tun will, so Dank für seine Hilfe :)

Antwort

7

Segue es Bestandteil der Storyboard-Interaktion ist es möglich, zu verstehen, vom Namen der Klasse UIStoryboardSegue. Es ist keine gute Idee, Programme programmgesteuert zu erstellen. Wenn ich keinen Fehler mache, erstellt Storyboard sie für dich.

Für die Lösung Ihres Problems versuchen Sie, einige allgemeine Möglichkeiten wie einfach präsentieren ViewController.

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

Wie ich aus unserer Konversation in Kommentaren verstehe. Sie möchten die Navigation für die Tabellenansicht in der Detailansicht mithilfe von Segmenten ohne Storyboard erstellen. Bis jetzt ist es unmöglich, dies ohne Storyboard zu machen.

Für zukünftiges Lernen versuchen, dies zu untersuchen information.

+0

Vielen Dank für Ihre Antwort zu verwenden ist, habe ich versucht, mit Pushviewcontroller, und es wurde die Ansicht ersetzt und verursacht Probleme auf iPhones 6 Plus und 6S Plus im Querformat. Ihre Lösung funktioniert nicht für mich, weil ich keine Storyboards habe, also gibt self.storeboard immer nil zurück, aber ich habe Referenzen der beiden Controller in der splitView in die AppDelegate-Datei bekommen und funktioniert immer noch nicht "application probiert um einen aktiven Controller modal darzustellen " – EddyW

+0

Verwenden Sie den Navigationcontroller, um View-Controller darauf darzustellen. –

+0

versucht mit: lassen Sie navC = UINavigationController (rootViewController: shared.mediaListController) selbst.presentViewController (navC, animiert: true, completion: nil) Und es funktioniert, aber nicht das, was ich suche ^^ Ich möchte nur die Detailansicht wie im xcode Beispiel der Master/Detailansicht auf iPhones – EddyW

0

Eine Möglichkeit, die didSelectRow Methode für tableView

Swift 3.x

// 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) 
} 
Verwandte Themen