【问题标题】:How to pass UIViewController as a parameter swift 3?如何将 UIViewController 作为参数传递 swift 3?
【发布时间】:2017-06-07 11:36:14
【问题描述】:

我正在尝试创建一个通用方法,我必须将 self(current UIViewController ) 作为参数传递。方法如下:

  func getFBUserData(){

        if let token = FBSDKAccessToken.current(){

        print("Access Token: \(token.tokenString!)")

            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
                if (error == nil){
                    self.dict = result as! [String : AnyObject]
                    print(result!)
                    print(self.dict)
                    var jsonObj = JSON(result!)
                    if let first_name = jsonObj["first_name"].string {
                        NSLog("first_name : \(first_name)")
                    }
                    NSLog("RESULT JSON : \(JSON(result!))")
                    //print("Access Token: \(FBSDKAccessToken.current())")
                }
            })
        }

    }

我修改如下:

func IsFaceBookPermisssionGranted(_ completion: @escaping (_ IsPermissionGranted: Bool, _ error_type:ErrorType)->()) {

    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()

    fbLoginManager.logIn(withReadPermissions: ["email"], from: UIViewController?) { (result, error) in
        if (error == nil){
            let fbloginresult : FBSDKLoginManagerLoginResult = result!
            if fbloginresult.grantedPermissions != nil {
                if(fbloginresult.grantedPermissions.contains("email"))
                {
                    completion(true,nil)
                }
            }else{
                completion(false,.AUTH_FAILED)
            }
        }else{
            print("Error : \(error)")
            completion(false,.AUTH_FAILED)
        }
    }
}

但是当我像上面一样通过 UIViewController 时,它说 无法将“UIViewController.Type”类型的值转换为预期的参数类型“UIViewController!”

对此我能做什么?

【问题讨论】:

  • 试试 UIViewController.self
  • 自己试试吧。
  • 而不是 UIViewController?,传递 ViewController 对象,在您的情况下将是 self 。最好创建当前 View Controller 的弱引用,然后传递它以避免强引用。 weak var weakself = self fbLoginManager.logIn(withReadPermissions: ["email"], from:weakself)
  • 这个方法 IsFaceBookPermisssionGranted(_ completion:) 在哪里创建,它在单独的类中吗?还是在 UIViewController 子类中?
  • @NiravD 我在 viewController 中调用它。但我想在一个公共类中使用这个方法。通过在 ViewController 中启动该类,我想调用此方法。

标签: ios swift swift3 uiviewcontroller


【解决方案1】:

在 swift 3.0 中, 你不能直接传递你的 UIViewController。 首先你可以创建一个视图控制器对象。

例如,

let storyBoard = UIStoryboard.init(name: "Main", bundle: nil)
let yourVC = self.storyboard?.instantiateViewController(withIdentifier: "your_view_controller_Identifier") as! YourViewController

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2017-11-04
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多