web-dev-qa-db-ja.com

IOS - プログラムを使ってswiftを使ってセグメント化する方法

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: ユーザーのデータを取得したら、このカスタムクラス内から次のビューにどのように移動できますか?

編集: 明確にするために、ストーリーボードに識別子を持つセグエを持っています。そして、ビューコントローラではないクラスからセグエを実行する方法を見つけようとしています

169
Shlomi Schwartz

あなたの2つのビューの間のセグエ識別子と共にあなたのセグエがストーリーボードに存在するなら、あなたは単にプログラムを使用してそれを呼び出すことができます:

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

古いバージョンの場合

performSegueWithIdentifier("mySegueID", sender: nil)

あなたもすることができます:

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

ナビゲーションコントローラを使用している場合

self.navigationController?.pushViewController(nextViewController, animated: true)
310
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)
}
21
Rodrigo Otero

あなたはこのようにsegueを使うことができます:

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

    }
}
14
Ricky

あなたのセグエが2つのビューの間のセグエ識別子とともにストーリーボードに存在する場合は、次のようにしてプログラムで呼び出すことができます。

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

ナビゲーションコントローラーを使用している場合

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

Navigation Controllerを使用した2番目のアプローチとしてお勧めします。

12
Manish Mahajan

Swift 3 - SpriteKitでも動作する

NSNotification を使用できます。

例:

1.)ストーリーボードにセグエを作成し、識別子に "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またはシーンで、セグエをトリガしたい場所にPostメソッドを追加します。

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

あなたがしたいことはユニットテストにとって本当に重要です。基本的にはView Controllerで小さなローカル関数を作成する必要があります。関数に任意の名前を付け、performSegueWithIndentifierを含めるだけです。

func localFunc() {
    println("we asked you to do it")
    performSegueWithIdentifier("doIt", sender: self)
}

次に、ユーティリティクラスFBManagerを変更して、関数の引数を取るイニシャライザと、セグエを実行する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を使用すると、セグエを実行せずに単体テストでこれを使用できます。)

最後に、// todo:がある場合は次のビューに進みます。???、次の行に沿って何かを置きます。

self.yourFunction()

単体テストでは、単に次のように呼び出すことができます。

let f = UtilClass()
f.doThatThing()

doThatThingはfbsessionstatechange、UtilClassはFBManagerです。

実際のコードでは、FBManagerクラスにlocalFunc(括弧なし)を渡すだけです。

2
Bill

performSegueWithIdentifier関数を使ってこれを行うことができます。

Screenshot

構文:

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

例:

 performSegueWithIdentifier("homeScreenVC", sender: nil)
1

これは私のために働きました。

まず最初に、ストーリーボードのView Controllerに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