[英]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.destinationViewController
為nil
或其他類型的問題。 確保在界面構建器中正確配置了segue,並且目標視圖控制器實際上在身份檢查器選項卡中具有其類值的segue.destinationViewController
。
我在情節提要板上有一個地圖對象,但沒有為創建錯誤消息的對象添加出口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.