Tworzę aplikację, która używa Facebook SDK do uwierzytelniania użytkowników. Próbuję skonsolidować logikę Facebooka w osobnej klasie. Oto kod (uproszczony dla uproszczenia):
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???
}
}
}
Używam powyższej metody klasy do sprawdzania zmian stanu sesji i działa dobrze.
P: Jak mam dane użytkownika, jak mogę przejść do następnego widoku z tej niestandardowej klasy?
EDYCJA: żeby być jasnym, mam sekwencję z identyfikatorem w serii ujęć i próbuję znaleźć sposób na wykonanie segue z klasy, która nie jest kontrolerem widoku
performSegue:
?Odpowiedzi:
Jeśli Twój segue istnieje w serii ujęć z identyfikatorem segue między Twoimi widokami, możesz po prostu wywołać go programowo, używając:
W przypadku starszych wersji:
Możesz także:
Lub jeśli jesteś w kontrolerze nawigacyjnym:
źródło
Możesz użyć NSNotification
Dodaj metodę postu do swojej klasy niestandardowej:
Dodaj obserwatora do swojego ViewController:
Dodaj funkcję w tobie ViewController:
źródło
Jeśli Twój segue istnieje w serii ujęć z identyfikatorem segue między Twoimi widokami, możesz po prostu wywołać go programowo za pomocą
Jeśli jesteś w kontrolerze nawigacyjnym
Polecę cię do drugiego podejścia przy użyciu kontrolera nawigacyjnego.
źródło
Możesz użyć segue w następujący sposób:
źródło
Swift 3 - Działa również z SpriteKit
Możesz użyć NSNotification .
Przykład:
1.) Utwórz segue w serii ujęć i nazwij identyfikator „segue”
2.) Utwórz funkcję w ViewController, z którego segregujesz.
3.) W ViewDidLoad () kontrolera ViewController oddzielasz się od utworzenia obserwatora.
Aktualizacja - ostatnim razem, gdy go użyłem, musiałem zmienić
.addObserver
wywołanie na następujący kod, aby wyciszyć błędy.4.) W ViewController lub scenie, do której segregujesz, dodaj metodę Post wszędzie tam, gdzie chcesz, aby została uruchomiona segue.
Aktualizacja - ostatnim razem, gdy go użyłem, musiałem zmienić
.post
wywołanie na następujący kod, aby wyciszyć błędy.źródło
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)
To, co chcesz zrobić, jest naprawdę ważne dla testów jednostkowych. Zasadniczo musisz utworzyć małą funkcję lokalną w kontrolerze widoku. Nazwij funkcję cokolwiek, po prostu dołącz
performSegueWithIndentifier
.Następnie zmień klasę użyteczności, tak
FBManager
aby zawierała inicjator, który pobiera argument funkcji i zmienną do przechowywania funkcji ViewController wykonującej segue.(Wygodna inicjacja pozwala na użycie tego w testach jednostkowych bez wykonywania segue.)
Na koniec, gdzie masz // todo: segue do następnego widoku ???, umieść coś wzdłuż linii:
W testach jednostkowych możesz po prostu wywołać go jako:
gdzie doThatThing to twoja fbsessionstatechange i
UtilClass
jest FBManager.W celu uzyskania rzeczywistego kodu wystarczy przekazać
localFunc
(bez nawiasów) do klasy FBManager.źródło
To zadziałało dla mnie.
Przede wszystkim nadaj kontrolerowi widoku w swojej serii ujęć identyfikator serii ujęć w inspektorze tożsamości. Następnie użyj następującego przykładowego kodu (upewniając się, że klasa, nazwa scenorysu i identyfikator scenorysu odpowiadają tym, którego używasz):
Aby uzyskać więcej informacji, zobacz http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html najlepsze życzenia
źródło
Możesz to zrobić za pomocą
performSegueWithIdentifier
funkcji.Składnia:
Przykład:
źródło
Inną opcją jest użycie modalnego segue
KROK 1: Przejdź do scenorysu i nadaj kontrolerowi widoku identyfikator scenorysu . Gdzie możesz zmienić identyfikator scenorysu w Inspektorze tożsamości po prawej stronie. Zadzwoń do ID scenorysu
ModalViewController
KROK 2: Otwórz kontroler widoku „nadawca” (nazwijmy go
ViewController
) i dodaj do niego ten kodPamiętaj, że nazywany jest również kontroler widoku, który chcemy otworzyć
ModalViewController
KROK 3: Aby zamknąć ModalViewController, dodaj to do niego
źródło
To działało dla mnie:
źródło