it-swarm-ko.com

IOS - swift를 사용하여 프로그래밍 방식으로 분할하는 방법

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를 수행하는 방법을 찾고 있습니다. 뷰 컨트롤러가 아닌 클래스

172
Shlomi Schwartz

스토리 보드에 두 개의보기간에 세그먼트 식별자가있는 세그먼트가있는 경우 다음을 사용하여 프로그래밍 방식으로 호출 할 수 있습니다.

performSegue(withIdentifier: "mySegueID", sender: nil)

이전 버전 :

performSegueWithIdentifier("mySegueID", sender: nil)

당신은 또한 할 수 :

presentViewController(nextViewController, animated: true, completion: nil)

또는 네비게이션 컨트롤러에있는 경우 :

self.navigationController?.pushViewController(nextViewController, animated: true)
314
Jérôme Leducq

사용할 수 있습니다 NSNotification

사용자 정의 클래스에 post 메소드를 추가하십시오.

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)
}
20
Rodrigo Otero

스토리 보드에 두 개의 뷰 사이에 구분 기호가있는 세그먼트가있는 경우이를 사용하여 프로그래밍 방식으로 호출 할 수 있습니다.

self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

네비게이션 컨트롤러에있는 경우

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)        
self.navigationController?.pushViewController(viewController, animated: true)

네비게이션 컨트롤러를 사용하여 두 번째 접근법을 추천합니다.

14
Manish Mahajan

다음과 같이 segue를 사용할 수 있습니다.

self.performSegueWithIdentifier("Push", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if segue.identifier == "Push" {

    }
}
14
Ricky

Swift 3 - SpriteKit 에서도 작동합니다.

NSNotification 을 사용할 수 있습니다.

예 :

1.) 스토리 보드에 세그먼트 (segue)를 만들고 식별자에 "segue"

2.)에서 segueing하는 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 또는 Segueing 할 장면에서 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)
12
Timmy Sorensen

당신이하고 싶은 것은 단위 테스트에서 정말로 중요합니다. 기본적으로보기 컨트롤러에서 작은 로컬 함수를 만들어야합니다. 함수의 이름을 지정하고 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를 다음 뷰로 이동하려면 다음 행을 따라 무언가를 넣으십시오.

self.yourFunction()

단위 테스트에서는 다음과 같이 호출 할 수 있습니다.

let f = UtilClass()
f.doThatThing()

여기서 doThatThing은 fbsessionstatechange이고 UtilClass은 FBManager입니다.

실제 코드의 경우 localFunc (괄호 안 함)을 FBManager 클래스에 전달하면됩니다.

2
Bill

performSegueWithIdentifier 함수를 사용하여이 작업을 수행 할 수 있습니다.

Screenshot

구문 :

func performSegueWithIdentifier(identifier: String, sender: AnyObject?)

예 :

 performSegueWithIdentifier("homeScreenVC", sender: nil)
1
Jayprakash Dubey

이것은 나를 위해 일했습니다.

먼저 스토리 보드의보기 컨트롤러에 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

1
amdan