2016-07-18 5 views
0

Wie wird UINavigationController angezeigt, wenn ein Benutzer auf eine Tabellenzelle klickt? Nur Code.Wie wird UINavigationController von der Methode didSelectRowtAtIndexPath von UITableViewDelegate angezeigt?

Der folgende Code funktioniert nicht:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    guard let vm = (viewModel as? UICatalogVM)?.modelForRowAtIndexPath(indexPath) else { 
     return 
    } 
    let vc = ActivityIndicatorVC(viewModel: vm) 
    let nc = UINavigationController(rootViewController: self) 
    nc.pushViewController(vc, animated: true) 
} 

Im Gegenteil solchen Code funktioniert, aber es ist modal die VC geht anzuzeigen, was nicht ist, was würde ich tun.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    guard let vm = (viewModel as? UICatalogVM)?.modelForRowAtIndexPath(indexPath) else { 
     return 
    } 

    let vc = ActivityIndicatorVC(viewModel: vm) 
    self.showViewController(vc, sender: self) 
} 
+1

mit ich glaube, Sie einen Schritt verpasst, wo auf 'rootViewController' zu Ihrem neuen' UINavigationController', die in Ihrem Fall ist 'nc'. dann setze 'nc = UINavigationController()'. Andererseits ist es üblich, zuerst den TableViewController in den Navigationscontroller einzubetten und dann den neuen ViewController zu drücken. – xmhafiz

+0

cod3rite Danke für den Hinweis, dass es üblich ist, den UITableViewController in UINavigationController einzubetten. Was meinst du mit vergessen, den rootViewController zu setzen? Im obigen Beispiel ist es auf self gesetzt, das self ist ein UIViewController. –

Antwort

0

Wenn Ihre aktuelle View-Controller bereits in einem Navigationscontroller ist, dann können Sie direkt gefällt es:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    guard let vm = (viewModel as? UICatalogVM)?.modelForRowAtIndexPath(indexPath) else { 
     return 
    } 
    let vc = ActivityIndicatorVC(viewModel: vm) 
    navigationController.pushViewController(vc, animated: true) 
} 

Andernfalls müssen Sie Ihre aktuelle View-Controller in der Navigation-Controller hinzufügen, bevor seine vor kommenden .

Zum Beispiel, wenn Sie Storyboard und die aktuelle Ansicht Controller verwenden initial View-Controller dann Sie eine UINavigationController als Anfang View-Controller hinzufügen und dann Ihren aktuellen View-Controller als RootViewController gesetzt für die Navigationssteuerung dann können Sie leicht Push neue view-Controller auf didSelectRowAtIndexPath:

navigationController.pushViewController(vc, animated: true)