簡體   English   中英

如何在Swift中調用performSegueWithIdentifier

[英]How to call performSegueWithIdentifier in Swift

我已經創建了prepareForSegue方法,並且嘗試通過使用performSegueWithIdentifier方法創建的按鈕調用它。 當我加載模擬器時,該應用程序崩潰了,並且沒有得到完整的錯誤消息。 有人可以引導我朝正確的方向前進嗎?

import Foundation
import UIKit
import Alamofire
import FBSDKCoreKit
import FBSDKShareKit
import FBSDKLoginKit

class PageContentViewController: UIViewController {

    @IBOutlet weak var logoImageView: UIImageView!
    @IBOutlet weak var contentLabel: UILabel!
    @IBOutlet weak var backgroundImageView: UIImageView!


    @IBOutlet weak var pageControl: UIPageControl!

    @IBOutlet weak var facebookButton: UIButton!

    var index : Int = 0
    var logoFile: String = ""
    var content: String = ""
    var backgroundFile: String = ""

    let facebookReadPermissions = ["public_profile", "email", "user_friends"]

    override func viewDidLoad() {
        super.viewDidLoad()
        pageControl.currentPage = index

        facebookButton.hidden = (index == 3 ) ? false : true
        pageControl.hidden = (index == 3) ? true: false

        logoImageView.image = UIImage(named: logoFile)
        contentLabel.text = content
        backgroundImageView.image = UIImage(named: backgroundFile)
    }



    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

        if let destinationController = segue.destinationViewController as? PaymentSubViewController
            where segue.identifier == "payment" {
                // Do something with `destinationController`
        }
    }


    @IBAction func test(sender: AnyObject) {

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

    }




    @IBAction func fbTouched(sender: AnyObject) {
        FBSDKLoginManager().logInWithReadPermissions(self.facebookReadPermissions, handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
            if error != nil {
                //According to Facebook:
                //Errors will rarely occur in the typical login flow because the login dialog
                //presented by Facebook via single sign on will guide the users to resolve any errors.

                // Process error
                FBSDKLoginManager().logOut()
            } else if result.isCancelled {
                // Handle cancellations
                FBSDKLoginManager().logOut()
            } else {
                let fbToken = result.token.tokenString

                Alamofire.request(Router.FacebookAuth(fbToken)).validate(statusCode: 200 ..< 300).responseJSON(completionHandler: { (request, response, JSON, error) in
                    if let json = JSON as? Dictionary<String, AnyObject> {
                        if let token = json["token"] as? String {
                            Router.OAuthToken = token
                            self.performSegueWithIdentifier("showHomeFeed", sender: self)
                        }
                    }
                })
            }
        })
    }

}

因為您用as!強制展開destinationViewController as! ,如果該值為nil或不是PaymentSubViewController ,則該應用將崩潰。

實現此目的的更好方法是使用可選綁定( if let )和條件下調( as? ):

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    if let destinationController = segue.destinationViewController as? PaymentSubViewController
        where segue.identifier == "payment" {
            // Do something with `destinationController`
    }
}

當然,這將停止崩潰,但不會回答為什么segue.destinationViewControllernil或其他類型的問題。 確保在界面構建器中正確配置了segue,並且目標視圖控制器實際上在身份檢查器選項卡中具有其值的segue.destinationViewController

我在情節提要板上有一個地圖對象,但沒有為創建錯誤消息的對象添加出口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM