2016-03-20 13 views
0

Ich habe eine Instanz einer Klasse, die Swipe-Navigation zwischen meinen View-Controllern behandelt und implementiert. Ich habe eine Methode in dieser Klasse, mit der ich eine Swipe-Navigation zu einem anderen View-Controller simulieren kann.Aufrufmethode einer anderen Klasse ohne Instanz zu erstellen

In einem perfekten Szenario würde ich eine Schaltfläche zu einem View-Controller in der IB hinzufügen und in seiner Aktion diese Methode der Handler-Klasse aufrufen, um zu den anderen View-Controller zu navigieren.

Es scheint, als ob das, was ich versuche, eine Instanz neu erstellt und offensichtlich nicht funktioniert, weil es nicht alle Informationen der anderen Instanz hat.

Ich habe auch versucht, eine Unteransicht einer Schaltfläche zu meinem View-Controller aus der Handler-Klasse selbst und das funktionierte, aber ich wollte wissen, ob es einen schöneren Weg gab.

Vielleicht Zugriff auf die bereits vorhandene Instanz der Klasse von meinem anderen View-Controller, um die Methode aufzurufen?

Ich habe versucht, swipe().navigateToLeftVC() und die Instanz neu erstellt.

+0

Ich habe gerade festgestellt, dass die erste Instanz im App-Delegate erstellt und dem window.rootviewcontroller zugewiesen wird. Wäre das hilfreich? Nochmals vielen Dank – Walking

+1

Vielleicht könnten Sie eine globale Variable erstellen, die den Instanzwert wie folgt hat: 'Lassen Sie myInstance = myClass()' und verweisen Sie dann auf diese Instanz, wann immer Sie Ihre Funktion aufrufen müssen. Sie können auf diese Instanz überall verweisen, da sie im globalen Gültigkeitsbereich definiert ist. Erstellen Sie möglicherweise auch ein Singleton anstelle einer globalen Variablen. – Harish

+0

Sie können die Instanz auch an jeden View-Controller übergeben – Shades

Antwort

1

Ich löste dies durch Erstellen eines Singleton.

Added dieser Code auf meinen Controller

class var sharedManager: controllerName { 
     struct Static { 
      static let instance = controllerName() 
     } 
     return Static.instance 
    } 

Dann in meinen app-Delegaten, wo ich es in den Wurzel-View-Controller zugewiesen I controllerName.sharedManager verwendet, die meine Singleton-Instanz zurückgegeben.

Dann in meinem anderen View-Controller, wenn ich eine Methode dieser Klasse anrufen wollte ich controllerName.sharedManager.methodName().

Funktioniert perfekt.

+1

Während dies in dieser Anwendung funktionieren könnte. Sie sollten wirklich vermeiden, unnötige Instanzen Ihrer View Controller zu machen. Mit diesem Ansatz haben Sie jetzt zwei Versionen Ihrer Klasse * controllerName() * da draußen. Dies kann später zu unerwarteten Problemen führen. Ich habe ein paar mögliche Alternativen für Sie. Verwenden Sie einen Navigationscontroller? –

+1

Tatsächlich ist das Wort * perfekt * hier eine Strecke. Dies ist keine perfekte Lösung. Es kann funktionieren, sicher. Aber in Wirklichkeit ist dies nicht die ideale Lösung. Wir müssten mehr von dem sehen, was in Ihrem tatsächlichen Code vor sich geht, um zu verstehen, warum Sie das überhaupt für nötig halten. – nhgrif

+0

Vielen Dank für Ihr Wissen. @ nhgrif: Ich habe eine Klasse (EZSwipeController), die das Seitenwischen durch Ihre View-Controller implementiert. Es kommt mit einer Navigation Controller-Implementierung, die ich nicht verwende, da es nicht mit meiner Anwendung passt. Also brauchte ich eine Möglichkeit, um Schaltflächen in meinen View-Controllern zu haben, die Methoden der EZSwipeController-Bibliothek aufgerufen haben, um abwechselnd die View-Controller zu wischen und durch die Button-Aktion navigieren zu können. Kannst du erklären, wie ich zwei Versionen von ControllerName habe, wenn ich nur 1 instanziiere? – Walking

Verwandte Themen