Error: Could not cast value of type 'FirstApp.ChoosePageViewController' to 'FirstApp.CreateAccountPageViewController'

Error: Could not cast value of type 'FirstApp.ChoosePageViewController' to 'FirstApp.CreateAccountPageViewController'

我正在使用 Xcode 6.3.2 创建单视图应用程序。

我已将其设置为第一个视图控制器是主页(图 1),当它出现时,它会自动转到 login/register/guest 页面。 (图 2。)

从那里,如果有人选择注册,它会将他们带到一个快速屏幕(图 3.),这只是一个背景视图,用于检查注册是否有效。从该屏幕,它会自动调出注册页面。 (图 4。)

然后,如果注册完成或成功,注册页面将返回到检查屏幕,然后返回到 login/register/guest 页面。

无法添加很多链接,所以我上传了项目的 zip 文件夹和 4 张图片。

我的项目: http://www.mediafire.com/download/dnv1vqlx3j741zv/FirstApp.zip

一切正常,直到取消注册为止。如果取消注册,它将返回到检查屏幕,然后就停留在那里。我环顾四周,找不到任何适合我解决问题的方法,不幸的是我无法从错误消息中找出解决方案。感谢所有提供帮助的人!

我的错误信息: 无法将类型 'FirstApp.ChoosePageViewController' (0x101edd680) 的值转换为 'FirstApp.CreateAccountPageViewController' (0x101edd380)。 (lldb)

Login/Register/Guest 页面视图控制器:

import UIKit

class ChoosePageViewController: UIViewController {

//Sets Button Outlets to Edit Displays
@IBOutlet weak var viewLoginButton: UIButton!
@IBOutlet weak var viewRegisterButton: UIButton!
@IBOutlet weak var viewGuestButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.

    viewLoginButton.layer.cornerRadius = 5.0
    viewRegisterButton.layer.cornerRadius = 5.0
    viewGuestButton.layer.cornerRadius = 5.0
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

注册检查页面视图控制器:

import UIKit

class RegistrationCheckPageViewController: UIViewController, DetailsDelegate {

@IBOutlet weak var viewRegistrationStatusLabel: UILabel!
@IBOutlet weak var viewRegistrationForceQuitLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//Allow CreateAccountPage to Edit RegistrationCheckPage Labels
func labelDelegateMethodWithString(RegistrationStatus: String, RegistrationForceQuit: String) {
    viewRegistrationStatusLabel.text! = RegistrationStatus
    viewRegistrationForceQuitLabel.text! = RegistrationForceQuit
}

//Prepare RegistrationCheckPage Controller for CreateAccountPage Controller Takeover
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    let controller = segue.destinationViewController as! CreateAccountPageViewController
    controller.delegate = self
}

//Immediately Present Create Account Page, Dismiss When Account is Created
//Display Error and Return to Create Account Page if Account Creation Fails Unexpectedly
override func viewDidAppear(animated: Bool) {

    if(viewRegistrationStatusLabel.text == "Complete!") {
        self.performSegueWithIdentifier("toChoosePageFromRegistrationCheckPage", sender: self)
    } else if(viewRegistrationForceQuitLabel.text == "Active") {
        displayErrorAlert("Account not created.")
        self.performSegueWithIdentifier("toChoosePageFromRegistrationCheckPage", sender: self)
    } else if(viewRegistrationStatusLabel.text == "Checking..." && viewRegistrationForceQuitLabel.text == "Inactive"){
    } else {
        displayErrorAlert("An unknown error occurred.")
    }

    self.performSegueWithIdentifier("toCreateAccountPage", sender: self)
}

func displayErrorAlert(displayMessage: String) {
    var myAlert = UIAlertController(title: "Error", message: displayMessage, preferredStyle: UIAlertControllerStyle.Alert)
    let dismissAction = UIAlertAction(title: "Retry", style: UIAlertActionStyle.Default, handler: nil)
    myAlert.addAction(dismissAction)
    self.presentViewController(myAlert, animated: true, completion: nil)
}

/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/

}

创建帐户页面视图控制器:

import UIKit

//Allows RegistrationCheckPage and CreateAccountPage to Communicate
protocol DetailsDelegate {
    func labelDelegateMethodWithString(RegistrationStatus: String, RegistrationForceQuit: String)
}

class CreateAccountPageViewController: UIViewController {

//Sets Button Outlets to Edit Displays
@IBOutlet weak var viewCreateButton: UIButton!
@IBOutlet weak var viewCancelButton: UIButton!

var registrationStatus = "Checking..."
var registrationForceQuit = "Inactive"

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    viewCreateButton.layer.cornerRadius = 5.0
    viewCancelButton.layer.cornerRadius = 5.0
}

//CreateAccountPage Allows or Disallows RegistrationCheckPage to Continue
var delegate: DetailsDelegate!
override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    delegate.labelDelegateMethodWithString(registrationStatus, RegistrationForceQuit: registrationForceQuit)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBOutlet weak var userUsernameTextField: UITextField!
@IBOutlet weak var userEmailTextField: UITextField!
@IBOutlet weak var userPasswordTextField: UITextField!
@IBOutlet weak var userRepeatPasswordTextField: UITextField!

@IBAction func didPressCreateAccountButton(sender: AnyObject) {

    let userUsername = userUsernameTextField.text;
    let userEmail = userEmailTextField.text;
    let userPassword = userPasswordTextField.text;
    let userPasswordRepeat = userRepeatPasswordTextField.text;

    func displayAlert(displayMessage:String) {
        var myAlert = UIAlertController(title: "Wait!", message:displayMessage, preferredStyle: UIAlertControllerStyle.Alert)
        let dismissAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)
        myAlert.addAction(dismissAction)
        self.presentViewController(myAlert, animated: true, completion: nil)
    }

    //Check for Empty Fields
    if(userUsername.isEmpty || userEmail.isEmpty || userPassword.isEmpty || userPasswordRepeat.isEmpty) {
        displayAlert("All fields are required!")
        return;
    }

    //Make Sure Username Is Not In Use
    /*if(username is in use) {
    displayAlert("Username is already in use.")
    return;
    }*/

    //Make Sure Passwords Match
    if(userPassword != userPasswordRepeat) {
        displayAlert("The passwords did not match!")
        return;
    }

    //Store Data


    //Successful Registration
    registrationStatus = "Complete!"
    registrationForceQuit = "Inactive"
    delegate.labelDelegateMethodWithString(registrationStatus, RegistrationForceQuit: registrationForceQuit)
    self.dismissViewControllerAnimated(true, completion: nil)
}

//Cancel the Registration Without Finishing
@IBAction func didPressCancelRegistrationButton(sender: AnyObject) {
    registrationStatus = "Failed"
    registrationForceQuit = "Active"
    delegate.labelDelegateMethodWithString(registrationStatus, RegistrationForceQuit: registrationForceQuit)
    self.dismissViewControllerAnimated(true, completion: nil)
}

/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/

}

这一行:

let controller = segue.destinationViewController as! CreateAccountPageViewController

您的 segue.destinationViewController 不是您预期的那样,它实际上是一个 ChoosePageViewController

你有两个 segue,"toChoosePageFromRegistrationCheckPage""toCreateAccountPage"

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    let controller = segue.destinationViewController as! CreateAccountPageViewController
    controller.delegate = self
}

在这里,您必须检查 segue.identifier 是否等于 "toChoosePageFromRegistrationCheckPage""toCreateAccountPage" 并根据标识符将目的地转换为适当的视图控制器。