2017-04-18 4 views
1

Ich habe eine ViewController, wo ich eine Tabellenansicht habe und in jeder Zelle habe ich eine CollectionView.Wie kann ich pushViewController in einer Zelle verwenden Swift

Ich möchte in eine andere Ansicht gehen (wo ich eine Zurück-Taste haben wird), so habe ich versucht, meinen Code zu verwenden, die für die anderen Ansichten funktioniert:

let vc = self.storyboard?.instantiateViewController(withIdentifier: "detail") as! DetailView 
    vc.name = beachesNames[indexPath.row] 
    vc.imagak = imagesNames[indexPath.row] 
    self.navigationController?.pushViewController(vc, animated: true) 

Aber weil dieser Code ist in der TableViewCell ich habe einen Fehler, der sagt:

Werte vom Typ ‚HomeViewCell‘ habe kein Mitglied ‚Storyboard‘

gibt es einen alternativen Parameter, die ich Kann ich etwas anderes oder etwas anderes tun?

Vielen Dank im Voraus.

+1

Nur UINavigationController kann pushViewController. Nur UIViewController sollte UINavigationController haben. Eine Möglichkeit, dies zu tun, ist die Verwendung des Delegatenmusters, das es dem UIViewController ermöglicht, die Zelle (im Allgemeinen innerhalb einer UICollectionView, dann einer UICollectionViewCell) an einen bestimmten Punkt zu übergeben, damit die Zieldaten übergeben werden. – Larme

+0

@Larme Danke für Ihren Kommentar können Sie einen Beispielcode geben? –

+0

@Larme was ich getan habe ist eine 'var del: HomeViewController?' Und setze es in meiner 'cellForRow' als' cell.del = self' und dann in meiner didselect (von collectioview) Ich ersetze einfach self durch del. Was denkst du darüber ist es gut, ich habe ein Problem? (Es funktioniert ohne irgendwelche Warnungen) –

Antwort

0

Wenn Sie eine Sammlungsansicht in jeder Zelle haben, würde ich empfehlen, dass jede Zelle eine Containeransicht enthält. Der View-Controller, der mit der Containeransicht verknüpft ist, verfügt über ein Storyboard.

Der Code für die Push würde ein bisschen hässlich aussehen:

self.parent?.navigationController?.pushViewController(vc, animated: true) 

Die parent?. aus den enthaltenen View-Controller geht an den übergeordneten View-Controller.

+0

Danke für die Antwort, aber ich habe Sie nicht ganz verstanden, was meinst du Der View-Controller, der mit der Containeransicht verknüpft ist, wird ein Storyboard haben. ? –

+0

@mikevorisis [Container Ansichten] (https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html): [Hier] (https://spin.atomicobject.com/2015/07/21/ios-container-views /) ist ein grundlegendes Tutorial von vor ein paar Jahren. –

0

Was Ihnen fehlt das Storyboard ist Instanziierung:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
storyboard.instantiateViewControllerWithIdentifier("myNavigationController") as! UINavigationController 

Aber da dies stackoverflow answer sagt, dies ist in der Regel keine gute MVC-Design.

Möglicherweise möchten Sie in Delegatenmuster schauen oder NotificationCenter verwenden. Beide Wege lösen im Wesentlichen einen Aufruf der übergeordneten Ansicht aus, die dann die entsprechende Aktion behandelt.

2
let detailOrderVC = UIViewController() 
self.viewController()?.navigationController?.pushViewController(detailOrderVC, animated: true) 

Ich habe das getestet und es funktioniert gut. Ich hoffe das ist hilfreich für Sie.

0

Wenn Sie zu einer Ansichtsklasse wechseln, für die ein Layout erforderlich ist, müssen Sie das Layout gleichzeitig aufrufen. ex.

let layout = UICollectionViewFlowLayout() 
let nextViewclass = NextClass(collectionViewLayout: layout) 
self.navigationController?.pushViewController(nextViewclass, animated: true) 
0

Sie müssen klug

  1. erste in der Kette sichern erstellen Sie einen Delegaten in Tablecell-Klasse
  2. Das Delegat wird in der Sammelzelle didSelect Delegate aufgerufen werden.
  3. Die delegierte Methode wird im View-Controller sein, in dem Sie Push-Controller anzeigen können.
Verwandte Themen