Я создаю приложение, которое использует Facebook SDK для аутентификации пользователей. Я пытаюсь объединить логику facebook в отдельном классе. Вот код (вырезанный для простоты):
import Foundation
class FBManager {
class func fbSessionStateChane(fbSession:FBSession!, fbSessionState:FBSessionState, error:NSError?){
//... handling all session states
FBRequestConnection.startForMeWithCompletionHandler { (conn: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
println("Logged in user: \n\(result)");
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let loggedInView: UserViewController = storyboard.instantiateViewControllerWithIdentifier("loggedInView") as UserViewController
loggedInView.result = result;
//todo: segue to the next view???
}
}
}
Я использую метод класса выше, чтобы проверить изменения состояния сеанса, и он работает нормально.
Q: Как только у меня есть данные пользователя, как я могу перейти к следующему представлению в этом пользовательском классе?
РЕДАКТИРОВАТЬ: просто чтобы быть ясно, у меня есть переход с идентификатором на раскадровке, и я пытаюсь найти способ выполнить переход из класса, который не является контроллером представления
performSegue:
?Ответы:
Если ваш сценарий существует в раскадровке с идентификатором перехода между двумя вашими представлениями, вы можете просто вызвать его программно, используя:
Для более старых версий:
Вы также можете сделать:
Или, если вы находитесь в навигационном контроллере:
источник
Вы можете использовать NSNotification
Добавьте метод post в свой пользовательский класс:
Добавьте наблюдателя в свой ViewController:
Добавьте функцию в свой ViewController:
источник
Если ваш сценарий существует в раскадровке с идентификатором перехода между двумя вашими представлениями, вы можете просто вызвать его программно, используя
Если вы находитесь в навигационном контроллере
Я рекомендую вас для второго подхода с использованием навигационного контроллера.
источник
Вы можете использовать Segue, как это:
источник
Swift 3 - также работает со SpriteKit
Вы можете использовать NSNotification .
Пример:
1.) Создайте переход в раскадровке и назовите идентификатор «segue»
2.) Создайте функцию в ViewController, от которого вы переходите.
3.) В ViewDidLoad () вашего ViewController вы переходите от создания наблюдателя.
Обновление - в прошлый раз, когда я использовал это, я должен был изменить
.addObserver
вызов на следующий код, чтобы заглушить ошибки.4.) В ViewController или Scene, к которому вы обращаетесь, добавьте метод Post везде, где вы хотите, чтобы переход запускался.
Обновление - в прошлый раз, когда я использовал это, я должен был изменить
.post
вызов на следующий код, чтобы заглушить ошибки.источник
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)
То, что вы хотите сделать, действительно важно для модульного тестирования. По сути, вам нужно создать небольшую локальную функцию в контроллере вида. Назовите функцию как угодно, просто включите
performSegueWithIndentifier
.Затем измените свой служебный класс,
FBManager
чтобы он включал инициализатор, который принимает аргумент функции, и переменную для хранения функции ViewController, которая выполняет поиск.(Удобный init позволяет использовать это в модульном тестировании без выполнения перехода.)
Наконец, где у вас есть // todo: segue to next view ???, поместите что-то вроде:
В ваших модульных тестах вы можете просто вызвать его как:
где doThatThing - ваш fbsessionstatechange и
UtilClass
это FBManager.Для вашего реального кода просто передайте
localFunc
(без скобок) класс FBManager.источник
Это сработало для меня.
Прежде всего, дайте контроллеру представления в вашей раскадровке идентификатор Storyboard внутри инспектора идентификации. Затем используйте следующий пример кода (убедитесь, что класс, имя раскадровки и идентификатор раскадровки совпадают с теми, которые вы используете):
Для получения более подробной информации смотрите http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html наилучшие пожелания
источник
Вы можете сделать это, используя
performSegueWithIdentifier
функцию.Синтаксис:
Пример :
источник
Другой вариант заключается в использовании модального перехода
ШАГ 1. Перейдите к раскадровке и присвойте View Controller идентификатор раскадровки . Вы можете найти место для изменения идентификатора раскадровки в Identity Inspector справа. Позволяет назвать ID раскадровки
ModalViewController
ШАГ 2: Откройте контроллер представления «отправитель» (давайте назовем его
ViewController
) и добавьте в него этот кодОбратите внимание, что View Controller, который мы хотим открыть, также называется
ModalViewController
ШАГ 3: Чтобы закрыть ModalViewController, добавьте это к нему
источник
Это сработало для меня:
источник