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: ユーザーのデータを取得したら、このカスタムクラス内から次のビューにどのように移動できますか?
編集: 明確にするために、ストーリーボードに識別子を持つセグエを持っています。そして、ビューコントローラではないクラスからセグエを実行する方法を見つけようとしています
あなたの2つのビューの間のセグエ識別子と共にあなたのセグエがストーリーボードに存在するなら、あなたは単にプログラムを使用してそれを呼び出すことができます:
performSegue(withIdentifier: "mySegueID", sender: nil)
古いバージョンの場合
performSegueWithIdentifier("mySegueID", sender: nil)
あなたもすることができます:
presentViewController(nextViewController, animated: true, completion: nil)
ナビゲーションコントローラを使用している場合
self.navigationController?.pushViewController(nextViewController, animated: true)
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)
}
あなたはこのようにsegueを使うことができます:
self.performSegueWithIdentifier("Push", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if segue.identifier == "Push" {
}
}
あなたのセグエが2つのビューの間のセグエ識別子とともにストーリーボードに存在する場合は、次のようにしてプログラムで呼び出すことができます。
self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
ナビゲーションコントローラーを使用している場合
let viewController = YourViewController(nibName: "YourViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)
Navigation Controllerを使用した2番目のアプローチとしてお勧めします。
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)
あなたがしたいことはユニットテストにとって本当に重要です。基本的には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
(括弧なし)を渡すだけです。
これは私のために働きました。
まず最初に、ストーリーボードの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を参照してください 願い