2016-07-24 9 views
1

Ich entwickle gerade eine iOS-App mit der Bibliothek CarbonKit für die Navigation. Ich habe derzeit eine UITableView in der ersten Registerkarte, und ich möchte programmatisch zu einer anderen Registerkarte navigieren, wenn eine Zelle ausgewählt ist.Swift - Wie Methode aus einer bestimmten Instanz aufrufen?

I haben folgende Funktion unter meiner Haupt CarbonKit View-Controller implementiert:

import CarbonKit 

class ViewController: UIViewController, CarbonTabSwipeNavigationDelegate { 


    func carbonTabSwipeNavigation(carbonTabSwipeNavigation: CarbonTabSwipeNavigation, viewControllerAtIndex index: UInt) -> UIViewController  { 

     switch index { 
     case 0: 
      return self.storyboard!.instantiateViewControllerWithIdentifier("AircraftViewController") as! AircraftViewController 
     case 1: 
      return self.storyboard!.instantiateViewControllerWithIdentifier("LoadController") as! LoadController 
     case 3: 
      return self.storyboard!.instantiateViewControllerWithIdentifier("SettingsController") as! SettingsController 
     default: 
      return self.storyboard!.instantiateViewControllerWithIdentifier("ViewControllerOne") as! ViewControllerOne 
     } 
    } 

    func navigate(index: UInt) { 
     carbonTabSwipeNavigation.setCurrentTabIndex(index, withAnimation: true) 
    } 

} 

setCurrentTabIndex die Funktion von der Bibliothek vorgesehen ist, um programmatisch tabs zu wechseln.

In meinem UITableViewController ich habe folgendes:

import UIKit 
import CarbonKit 

class SecondViewController: UITableViewController { 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     \\ First Attempt 
     (ViewController() as CarbonTabSwipeNavigationDelegate).navigate(2) 

     \\ Second Attempt 
     let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("controller") as! ViewController 
     viewController.navigate(2) 
    } 

} 

Ich verstehe, dass mit meinem ersten Versuch habe ich eine neue Instanz von ViewController und mein zweiter Versuch erstellt haben wählen nicht die Instanz ich gehofft hatte.

Wie kann ich die Methode in der ersten Instanz ViewController von SecondViewController am besten aktivieren?

+0

Sie müssen sich an einen Verweis auf die von Ihnen erstellte "CarbonTabSwipeNavigation" halten. Ich schätze, Sie haben alles in Ihrem App-Delegierten eingerichtet. Wo implementieren Sie die Protokollmethode "carbonTabSwipeNavigation: viewControllerAtIndex"? Ich vermute, dass dies ein guter Ort wäre, um eine Eigenschaft mit der "CarbonTapSwipeNavigation" für jeden Kind-View-Controller festzulegen. Dann können Sie diese Eigenschaft in Ihrem 'SecondViewController' verwenden. – dylansturg

+0

Ich implementiere 'viewControllerAtIndex' in der obigen' viewController' Klasse. Wie lege ich einen ViewController als Eigenschaft fest? Ich habe meine Frage mit der oben erwähnten Methode 'viewControllerAtIndex' aktualisiert. – user3185748

Antwort

1

Starten Sie eine CarbonTabSwipeNavigation Eigenschaft auf Ihre SecondViewController Klasse durch Hinzufügen, so dass Sie den Zugriff auf Ihren Navigationsanbieter haben:

import UIKit 
import CarbonKit 

class SecondViewController: UITableViewController { 
    weak var carbonNavigation : CarbonTabSwipeNavigation?; 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     if let carbonNav = self.carbonNavigation { 
      carbonNav.setCurrentTabIndex(index, withAnimation: true) 
     } 
    } 

} 

Als nächstes müssen wir diese carbonNavigation Eigenschaft setzen, so dass es für den Einsatz zur Verfügung stehen wird. Es sieht so aus, als ob deine CarbonTabSwipeNavigationDelegate ein schöner Ort dafür ist. Nebenbei bemerkt, sehe ich nicht, dass Ihr SecondViewController jemals von Ihrem Delegaten zurückgegeben wird - ist das beabsichtigt?

import CarbonKit 

class ViewController: UIViewController, CarbonTabSwipeNavigationDelegate { 


    func carbonTabSwipeNavigation(carbonTabSwipeNavigation: CarbonTabSwipeNavigation, viewControllerAtIndex index: UInt) -> UIViewController  { 

     switch index { 
     case 0: 
      let aircraftVC = self.storyboard!.instantiateViewControllerWithIdentifier("AircraftViewController") as! AircraftViewController 
      aircraftVC.carbonNavigation = carbonTabSwipeNavigation 
      return aircraftVC 
     case 1: 
      // do something similar, instantiate view controller, set navigation property 
      return self.storyboard!.instantiateViewControllerWithIdentifier("LoadController") as! LoadController 
     case 3: 
      // do something similar, instantiate view controller, set navigation property 
      return self.storyboard!.instantiateViewControllerWithIdentifier("SettingsController") as! SettingsController 
     default: 
      // do something similar, instantiate view controller, set navigation property 
      return self.storyboard!.instantiateViewControllerWithIdentifier("ViewControllerOne") as! ViewControllerOne 
     } 
    } 

    func navigate(index: UInt) { 
     carbonTabSwipeNavigation.setCurrentTabIndex(index, withAnimation: true) 
    } 
} 

könnten Sie auch eine ViewController Eigenschaft anstelle eines CarbonTabSwipeNavigation hinzufügen und alle Methoden setzen Sie aus Kohlenstoff als Methoden in ViewController müssen. Das würde bedeuten, den Typ der Eigenschaftsdeklaration zu ändern und ihn auf self anstelle von carbonTabSwipeNavigation zu setzen.

+0

Scheint so, als ob du 'schwache Var' willst, um einen starken Referenzzyklus zu vermeiden. –

+0

Für den ersten Beitrag habe ich den Namen der 'AircraftViewController'-Klasse zur Vereinfachung in' SecondViewController' geändert und vergessen, sie zu ändern, als ich meinen Beitrag aktualisierte. Ansonsten funktioniert das wie ich gehofft habe. Ich habe nicht erwartet, dass ich meine Variable im zweiten View-Controller deklariere. Gibt es eine Ressource, die Sie empfehlen, um die Feinheiten von Cocoa und Xcode zusammen mit Swift zu lernen? Nochmals vielen Dank für Ihre Hilfe! – user3185748

+0

@AaronBrager Guter Punkt. Wird meinen Code aktualisieren. – dylansturg

Verwandte Themen