2015-10-13 2 views
0

У меня есть класс Data Manager, который обрабатывает некоторые действия JSON. Когда одно действие завершено, я хочу нажать на контроллер навигации.Нажатие навигационного контроллера из другого класса в Swift

FirstViewController вызывает функцию от класса DataManager

DataManager Класс

class func extract_json(data:NSData) -> Bool { 
    //Success 
    FirstViewController().pushToValueView() 
} 

FirstViewController Класс

func pushToValueView() { 
    println("Push to Value View") 
    navigationController?.pushViewController(ValueViewController(), animated: true) 
} 

В этом примере вызывается println(), но не происходит никакого нажатия. Если я позвоню pushToValueView() в FirstViewController, например. self.pushToValueView() (Для целей отладки) происходит нажатие.

+0

Вы создаете экземпляр FirstViewController, а не ссылаетесь на экземпляр, который уже используется и в иерархии навигации. В любом случае это плохой дизайн. Вы должны предоставить закрытие завершения для 'extract_json', который может выполнять push в контексте класса контроллера представления – Paulw11

+0

. Я понимаю, что вы имеете в виду, но как я могу назвать FirstViewController, тот, который называется DataManager в первую очередь? – Colin

+0

Когда экземпляр FirstViewController вызывает метод DataManager, он передает завершение закрытия этому методу. Когда метод DataManager впоследствии выполняет закрытие, он запускается в экземпляре Yhe FirstViewController – Paulw11

ответ

0

Попробуйте вызвать эту функцию в существующем экземпляре FirstViewController. Я думаю, что в этом примере вы пытаетесь нажать контроллер представления на FirstViewController, который освобождается после выхода из области метода. Вот почему контроллер просмотра не отображается

+0

Я понимаю, что вы имеете в виду, но я не знаю, как это сделать в Swift (тот же шаблон работает в моей версии Obj-C) FirstViewController вызывает функции DataManager, как я могу заставить их успешно вызвать вызывающий FirstViewController? – Colin

0

Разверните опцию. Изменить: Вы не должны вызывать свой виртуальный канал от класса модели Кстати, тот плохой MVC, я бы использовать наблюдатель, а и получить уведомление, когда крышка будет завершен

if let nav = self.navigationController { 
    println("Push to Value View") 
    nav.pushViewController(ValueViewController(), animated: true) 
} 
+0

К сожалению, не работает. – Colin

+0

Я отредактировал свой ответ. как добавить наблюдателя, чтобы прослушать завершение закрытия – Lukas

+0

Возможно, я смогу помочь, если вы можете поместить полный код – Lukas

0

Вы можете изменить свой extract_json функцию так, чтобы она принимает замыкание, которое должно выполняться после того, как данные были извлечены. Закрытие будет содержать код, чтобы нажать на новый контроллер представления, и он будет выполняться в контексте вызова, а не объект под названием:

В DataManager.swift -

func extractJSON(data:NSData, completion:() -> Void) { 

    //Do whatever 

    completion() 

} 

В FirstViewController.swift -

func getDataAndSegue() { 

    extractJSON(someData, completion:{ 
      navigationController?.pushViewController(ValueViewController(), animated: true) 
     } 
    ) 
} 
Смежные вопросы