2016-08-09 58 views
1

Ich versuche, das Änderungsereignis auf einem UISwitch zu verwenden, um vom aktuellen ViewController zu einem neuen zu wechseln. Mein UISwitch ist in meinem CustomView für die benutzerdefinierte Zelle in meinem UITableView registriert. Die Aktion wird registriert eine eine Klasse in meinem View Controller ruft, wie untenUISwitch kann nicht in einer benutzerdefinierten Zelle verwendet werden, um zu einem neuen Controller zu wechseln

import UIKit 

public class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var operatedSwitch: UISwitch! 

    @IBAction func operatedSwitchChange() { 
     updateValveOps.valveUpdate() 
    } 

Wenn es kommt zu meiner Klasse in meinem Viewcontroller es ein Verfahren in der Hauptklasse aufruft, die zu meinem neuen Viewcontroller wie unten

bewegen sollen
import UIKit 

class updateValveOps { 
    class func valveUpdate() { 
     let valveOps = ValveOperationsController() 
     valveOps.ValveOpsUpdate() 
    } 
} 

class ValveOperationsController: UIViewController { 
. 
. 
func ValveOpsUpdate() { 
    performSegueWithIdentifier("ValveOpsToUpdateSegue", sender: nil) 
} 

Dies verursacht jedoch einen Sigabrt-Fehler. Ich habe auch versucht, von der aktuellen Ansicht auf den neuen View Controller zu wechseln, aber dann kehrt er aus irgendeinem Grund zum Aufruf-View-Controller zurück! Was mache ich falsch?

+0

Es würde eine Menge helfen, wenn Sie Konventionen beachten z Start Calss Name mit Großbuchstabe – iShaalan

Antwort

0

ich einen Weg zu finden, es geschafft, dies zu erhalten Arbeiten mit Protokoll. Zuerst habe ich ein Protokoll zu meinem ValveOperationsController und verwiesen sie wie unten

protocol CustomCellDelegator { 
    func callSegueFromCell() 
} 

class ValveOperationsController: UIViewController, CustomCellDelegator { 

Dann einen Delegierten in meine Zelle in cellForRowInIndexPath

cell.delegate = self 

Dann habe ich die Methode genannt in meinem Protokoll in meinem Viewcontroller ich hinzugefügt

func callSegueFromCell() { 
    performSegueWithIdentifier("ValveOpsToUpdateSegue", sender: nil) 
} 

geht dann zu meiner CustomTableViewCell ich habe meine Delegierten

var delegate:CustomCellDelegator! 

Dann in dem Ereignisse aufgerufen, wenn die Schalter Änderungen, die ich den Anruf zu meinem Protokoll

if(self.delegate != nil){ //Just to be safe. 
     self.delegate.callSegueFromCell() 
} 

hinzugefügt Wenn das Ereignis aufgerufen wird, wenn der Schalter ändert es das Protokoll verlangt, die es zu meiner Methode übergibt und das Segue arbeitet erfolgreich

0

Versuchen Sie dies in Ihrem @IBAction func operatedSwitchChange() { .. }

UIApplication.sharedApplication().keyWindow?.visibleViewController()?.performSegueWithIdentifier("ValveOpsToUpdateSegue", sender: nil) 

und fügen Sie diese Erweiterung zu Ihrem Projekt (copy-paste diese in neue swift-Datei):

public extension UIWindow { 

    func visibleViewController() -> UIViewController? { 
     if let rootViewController: UIViewController = self.rootViewController { 
      return UIWindow.getVisibleViewControllerFrom(rootViewController) 
     } 
     return nil 
    } 

    class func getVisibleViewControllerFrom(vc:UIViewController?) -> UIViewController? { 
     if vc == nil { 
      return nil 
     } 

     if let navigationController = vc as? UINavigationController { 
      return UIWindow.getVisibleViewControllerFrom(navigationController.visibleViewController) 
     } else if let tabBarController = vc as? UITabBarController { 
      return UIWindow.getVisibleViewControllerFrom(tabBarController.selectedViewController) 
     } else { 
      if let presentedViewController = vc?.presentedViewController { 
       return UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController) 
      } else { 
       return vc 
      } 
     } 
    } 
} 
+0

Danke für Ihre Antwort Bacon, es schien einen Syntaxfehler zu geben, da visibleViewController nicht existierte. Ich ersetzte es durch inputViewController, aber es gab einen Fehler EXC_BAD_INSTRUCTIOn zurück. – user616076

+0

Danke für das Update, der Code lief ohne Probleme und endete trotzdem mit UISwitch in der aufrufenden Ansicht. Die erste Zeile, die es trifft, ist 5 und dann wieder 5 und schließlich 3, was bedeutet, dass vc im letzten Durchgang null ist. – user616076