[ios] iOS-스위프트를 사용하여 프로그래밍 방식으로 말을하는 방법

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" {

    }
}


답변

스위프트 3SpriteKit 과도 작동

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이며 UtilClassFBManager입니다.

실제 코드의 경우 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
희망 사항을 참조 하십시오