Facebook SDK를 사용하여 사용자를 인증하는 앱을 만들고 있습니다. 페이스 북 논리를 별도의 클래스로 통합하려고합니다. 코드는 다음과 같습니다 (단순함을 위해 줄임).
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 : 사용자 데이터가 확보되면이 사용자 정의 클래스에서 다음보기를 어떻게 확인할 수 있습니까?
편집 : 분명히하기 위해 스토리 보드에 식별자가있는 segue가 있으며 뷰 컨트롤러가 아닌 클래스에서 segue를 수행하는 방법을 찾으려고합니다.
답변
두보기 사이에 segue 식별자가있는 스토리 보드에 segue가있는 경우 다음을 사용하여 프로그래밍 방식으로 호출 할 수 있습니다.
performSegue(withIdentifier: "mySegueID", sender: nil)
이전 버전의 경우 :
performSegueWithIdentifier("mySegueID", sender: nil)
당신은 또한 할 수 있습니다 :
presentViewController(nextViewController, animated: true, completion: nil)
또는 내비게이션 컨트롤러에있는 경우 :
self.navigationController?.pushViewController(nextViewController, animated: true)
답변
NSNotification 을 사용할 수 있습니다
사용자 정의 클래스에 포스트 메소드를 추가하십시오.
NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)
ViewController에 관찰자를 추가하십시오.
NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOFReceivedNotication:", name:"NotificationIdentifier", object: nil)
ViewController에 함수를 추가하십시오.
func methodOFReceivedNotication(notification: NSNotification){
self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
}
답변
두 개의보기 사이에 segue 식별자가있는 스토리 보드에 segue가있는 경우 프로그래밍 방식으로 호출 할 수 있습니다.
self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
내비게이션 컨트롤러에있는 경우
let viewController = YourViewController(nibName: "YourViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)
내비게이션 컨트롤러를 사용하는 두 번째 방법을 추천합니다.
답변
다음과 같이 segue를 사용할 수 있습니다.
self.performSegueWithIdentifier("push", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if segue.identifier == "push" {
}
}
답변
스위프트 3 – SpriteKit 과도 작동
NSNotification 을 사용할 수 있습니다 .
예:
1.) 스토리 보드에서 segue를 만들고 식별자의 이름을 “segue”
2.) ViewController에서 함수를 생성하십시오.
func goToDifferentView() {
self.performSegue(withIdentifier: "segue", sender: self)
}
3.) ViewController의 ViewDidLoad ()에서 관찰자를 생성하십시오.
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)
업데이트 -마지막으로 이것을 사용했을 .addObserver
때 오류를 침묵시키기 위해 다음 코드에 대한 호출을 변경해야했습니다 .
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)
4.) 사용하려는 ViewController 또는 Scene에서 segue를 트리거 할 위치에 Post Method를 추가하십시오.
NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)
업데이트 -마지막으로 이것을 사용했을 .post
때 오류를 침묵시키기 위해 다음 코드에 대한 호출을 변경해야했습니다 .
NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "segue"), object: nil) as Notification)
답변
당신이하고 싶은 것은 단위 테스트에 정말로 중요합니다. 기본적으로 뷰 컨트롤러에서 작은 로컬 함수를 만들어야합니다. 함수의 이름을 아무거나 지정하십시오 performSegueWithIndentifier
.
func localFunc() {
println("we asked you to do it")
performSegueWithIdentifier("doIt", sender: self)
}
그런 다음 유틸리티 클래스 FBManager
를 변경하여 함수의 인수를 사용하는 초기화 자와 segue를 수행하는 ViewController의 함수를 보유하는 변수를 포함하십시오.
public class UtilClass {
var yourFunction : () -> ()
init (someFunction: () -> ()) {
self.yourFunction = someFunction
println("initialized UtilClass")
}
public convenience init() {
func dummyLog () -> () {
println("no action passed")
}
self.init(dummyLog)
}
public func doThatThing() -> () {
// the facebook login function
println("now execute passed function")
self.yourFunction()
println("did that thing")
}
}
편의상 init를 사용하면 segue를 실행하지 않고 단위 테스트에서 이것을 사용할 수 있습니다.
마지막으로, // todo : segue to next view ???가있는 곳 :
self.yourFunction()
단위 테스트에서 간단히 다음과 같이 호출 할 수 있습니다.
let f = UtilClass()
f.doThatThing()
여기서 doThatThing은 fbsessionstatechange이며 UtilClass
FBManager입니다.
실제 코드의 경우 localFunc
괄호없이 FBManager 클래스에 전달하십시오.
답변
이것은 나를 위해 일했습니다.
먼저 스토리 보드의 뷰 컨트롤러에 ID 관리자 내부에 스토리 보드 ID를 제공하십시오. 그런 다음 다음 예제 코드를 사용하십시오 (클래스, 스토리 보드 이름 및 스토리 보드 ID가 사용중인 것과 일치하는지 확인).
let viewController:
UIViewController = UIStoryboard(
name: "Main", bundle: nil
).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
// .instantiatViewControllerWithIdentifier() returns AnyObject!
// this must be downcast to utilize it
self.presentViewController(viewController, animated: false, completion: nil)
자세한 내용은 http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html
희망 사항을 참조 하십시오