取消Segue并显示alert - Xcode



我从这个网站获得了教程:http://jamesleist.com/ios-swift-tutorial-stop-segue-show-alert-text-box-empty/

这是我当前的代码。它只是不工作,这会导致应用程序崩溃,因为如果任何字段为空,下一个ViewController崩溃。

import Foundation
import UIKit
import Darwin
class View3on3 : UIViewController, UITextFieldDelegate {

@IBOutlet weak var APTeams: UITextField!
@IBOutlet weak var APRounds: UITextField!
@IBOutlet weak var APBreakers: UITextField!
var AP1: String = String()
var AP2: String = String()
var AP3: String = String()

override func viewDidLoad()
{
    super.viewDidLoad()
    initializeTextFields()
}

func initializeTextFields()
{
    APTeams.delegate = self
    APTeams.keyboardType = UIKeyboardType.NumberPad
    APRounds.delegate = self
    APRounds.keyboardType = UIKeyboardType.NumberPad
    APBreakers.delegate = self
    APBreakers.keyboardType = UIKeyboardType.NumberPad
}

@IBAction func userTappedBackground(sender: AnyObject)
{
    view.endEditing(true)
}
override func shouldPerformSegueWithIdentifier(identifier: String!, sender: AnyObject!) -> Bool {
    if identifier == "segueTest" {
        if (APTeams.text!.isEmpty) {
            let alert = UIAlertView()
            alert.title = "No Text"
            alert.message = "Please Enter Text In The Box"
            alert.addButtonWithTitle("Ok")
            alert.show()
            return false
        }
        else {
            return true
        }
    }
    // by default, transition
    return true
}

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "segueTest"){
            var passs = segue.destinationViewController as! View3on3Results
                passs.AP1 = APTeams.text!
                passs.AP2 = APRounds.text!
                passs.AP3 = APBreakers.text!
        }

}
}

我试着看关于SO的其他问题,但解决方案都抛出了错误。我认为这是由于Swift更新到2.0。我可能是错的,我是新手。

我希望这可能是因为AlertView。在swift 2.0中,UIAlertView被替换为UIAlertController:

let alertController: UIAlertController = UIAlertController(title: "Hello", message: "Are you sure?", preferredStyle: UIAlertControllerStyle.Alert)
let okAction = UIAlertAction(title: "Yes", style: UIAlertActionStyle.Default, handler: nil)
alertController.addAction(okAction)
presentViewController(alertController, animated: true, completion: nil)

用上面的代码将你的UIAlertView替换为UIAlertViewController

编辑:

也使IBOutlet可选:

@IBOutlet weak var APTeams: UITextField?
@IBOutlet weak var APRounds: UITextField?
@IBOutlet weak var APBreakers: UITextField?

我认为如果textfield不是empty,则应该使用performSegueWithIdentifier 手动调用segue,如果是,则显示alert

你的代码可能看起来像[当你提交你的数据或试图segue时可能是on按钮点击将此代码放在initializeTextFields()之后的viewDidLoad中]

if(APTeams.text!.isEmpty){
  // your code for showing alert. You can use UIAlertController if UIAlertView is not working.
}
else
{
  self.performSegueWithIdentifier("segueTest",sender: View3on3Results.self)
}

如果我没弄错的话,你不需要shouldPerformSegueWithIdentifier

解决!这就是有效的代码。谢谢@SohilRMemon和@FrequencyMatched帮我整理这些。

代码:

import Foundation
import UIKit
import Darwin
class View3on3 : UIViewController, UITextFieldDelegate {

@IBOutlet weak var APTeams: UITextField!
@IBOutlet weak var APRounds: UITextField!
@IBOutlet weak var APBreakers: UITextField!
var AP1: String = String()
var AP2: String = String()
var AP3: String = String()

override func viewDidLoad()
{
    super.viewDidLoad()
    initializeTextFields()
}

func initializeTextFields()
{
    APTeams.delegate = self
    APTeams.keyboardType = UIKeyboardType.NumberPad
    APRounds.delegate = self
    APRounds.keyboardType = UIKeyboardType.NumberPad
    APBreakers.delegate = self
    APBreakers.keyboardType = UIKeyboardType.NumberPad
}

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (APTeams.text!.isEmpty || APRounds.text!.isEmpty || APBreakers.text!.isEmpty)
        {
            let alertController: UIAlertController = UIAlertController(title: "Hello", message: "Are you sure?", preferredStyle: UIAlertControllerStyle.Alert)
            let okAction = UIAlertAction(title: "Yes", style: UIAlertActionStyle.Default, handler: nil)
            alertController.addAction(okAction)
            presentViewController(alertController, animated: true, completion: nil)
        }
        else
        {
            let DestViewController : View3on3Results = segue.destinationViewController as! View3on3Results
            DestViewController.AP1 = APTeams.text!
            DestViewController.AP2 = APRounds.text!
            DestViewController.AP3 = APBreakers.text!
            //self.performSegueWithIdentifier("segueTest",sender: View3on3Results.self)//
        }

        }
}

最新更新