如何使用Swift在iOS中进行编程式转场

207

我正在创建一个使用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: 一旦我获得了用户数据,如何从这个自定义类中进行视图间的跳转?

仅仅为了明确,我在 storyboard 上有一个带标识符的 segue,并且我正在尝试找到一种方式从不是视图控制器的类中执行 segue。


2
喜欢 performSegue: 吗? - HAS
是的,但这段代码不在视图控制器中,我该怎么实现呢? - Shlomi Schwartz
那么,在这种情况下,您应该将该工作(segueing)从执行工作的对象委托给视图控制器(通过完成块或委托方法)。 - HAS
获取非空布局异常 - Chris Hayes
12个回答

0
这对我有用:
//Button method example
 @IBAction func LogOutPressed(_ sender: UIBarButtonItem) {

        do {
            try Auth.auth().signOut()
            navigationController?.popToRootViewController(animated: true)

        } catch let signOutError as NSError {
          print ("Error signing out: %@", signOutError)
        }


    }

-1
要从不是视图控制器的类中执行segue,您可以使用委托或通知机制来通知视图控制器应该触发segue。
  1. 创建一个协议:

    protocol FBManagerDelegate: AnyObject {
         func didReceiveUserData(_ userData: AnyObject)
     }
    
  2. 添加一个委托属性:

    在你的FBManager类中,添加一个类型为FBManagerDelegate的委托属性:

    class FBManager {
         weak var delegate: FBManagerDelegate?
     }
    
  3. 从FBRequestConnection.startForMeWithCompletionHandler调用委托方法:

       // 通知委托用户数据
       self.delegate?.didReceiveUserData(result)
    
  4. 使你的视图控制器符合该协议:

    class UserViewController: UIViewController, FBManagerDelegate {}
    
  5. 设置委托:

    let fbManager = FBManager()
    fbManager.delegate = self
    
  6. 在视图控制器中实现委托方法:

    func didReceiveUserData(_ userData: AnyObject) {
     // 假设"segueIdentifier"是你的segue标识符
     performSegue(withIdentifier: "segueIdentifier", sender: self) }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接