2016-08-09 1 views
1

Я пытаюсь использовать событие изменения на UISwitch для перехода от текущего ViewController к новому. Мой UISwitch зарегистрирован в моем CustomView для пользовательской ячейки в моем UITableView. Действие, зарегистрирован вызывает класс в моем View Controller, как показано нижеНевозможно использовать UISwitch в пользовательской ячейке, чтобы перейти к новому контроллеру

import UIKit 

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

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

Когда он попадает в класс в моем ViewController он вызывает метод в главном классе, который должен двигаться к моему новому ViewController ниже

import UIKit 

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

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

Однако это приводит к ошибке Sigabrt. Я также попытался перейти от текущего представления к новому контроллеру View, но по какой-то причине он возвращается обратно в вызывающий контроллер просмотра! Что я делаю не так?

+0

Это поможет много, если вы будете соблюдать соглашения об именах, например Запуск названия calss с помощью заглавной буквы – iShaalan

ответ

0

мне удалось найти способ, чтобы получить это работающих с использованием протокола. Сначала я добавил протокол к моей ValveOperationsController и ссылаться как ниже

protocol CustomCellDelegator { 
    func callSegueFromCell() 
} 

class ValveOperationsController: UIViewController, CustomCellDelegator { 

Затем я добавил делегат в мою камеру в cellForRowInIndexPath

cell.delegate = self 

Затем я добавил метод, называемый в моем протоколе в мою ViewController

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

Тогда будет мой CustomTableViewCell я добавил мой делегат

var delegate:CustomCellDelegator! 

Тогда в случае вызывается при изменении переключателя я добавил вызов к моему протоколу

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

Когда событие вызывается, когда переключатель изменяет это вызывает протокол, который передает его в мой метод и Segue успешно работает

0

Попробуйте это в @IBAction func operatedSwitchChange() { .. }

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

И добавить это расширение для вашего проекта (копипаст это в новый стремительной файл):

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

Спасибо за ваш ответ Bacon, похоже, была синтаксическая ошибка, поскольку visibleViewController не существовал. Я заменил его на inputViewController, но он возвратил ошибку EXC_BAD_INSTRUCTIOn. – user616076

+0

Спасибо за обновление, код бежал без каких-либо проблем, но все же вернулся к вызывающему виду с помощью UISwitch. Первая строка, в которую он попадает, равна 5, а затем 5 снова и, наконец, 3, что означает, что vc равен нулю при последнем проходе. – user616076