Ios 只有在发生事情时才执行一个序列

Ios 只有在发生事情时才执行一个序列,ios,swift,storyboard,Ios,Swift,Storyboard,如何仅在条件发生时执行分段 我所尝试的: 在Main.storyboard中,我有两个视图控制器。我已将控件从ViewController.swift的视图控制器图标拖动到SecondViewController.swift中的任意位置 我选择带有segue的箭头,并在属性>标识符中给它命名为segueTo2 在ViewController.swift中,我有一个文本字段1和按钮totot2。故事板中的所有连接。我还有: @IBOutlet weak var textField1: UITex

如何仅在条件发生时执行分段

我所尝试的:

  • 在Main.storyboard中,我有两个视图控制器。我已将控件从ViewController.swift的视图控制器图标拖动到SecondViewController.swift中的任意位置

  • 我选择带有segue的箭头,并在属性>标识符中给它命名为segueTo2

  • 在ViewController.swift中,我有一个文本字段1和按钮totot2。故事板中的所有连接。我还有:

    @IBOutlet weak var textField1: UITextField!  
    
    @IBAction func goTo2(_ sender: UIButton) {
      performSegue(withIdentifier: "segueTo2", sender: self)
    }
    
    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    
    let str: String? = textField1.text
    if str!.isEmpty {
         print ("text field is empty. Do not do the segue")
         return false
     }
     else {
         return true
     }
    
    }

同样的代码在macOS中运行良好(仅将textField1.text更改为textField1.stringValue)。在iOS中,它不起作用。也就是说,当textField1为空时,它仍然会生成segue

如何仅在文本字段包含内容时进行切换?

这解释了您的逻辑发生了什么


相反,您可以做的是,在执行segue之前检查按钮函数中的文本字段是否已填充。

简单的解决方案是,在调用
performsgue

@IBAction func goTo2(_ sender: UIButton) {
    guard !textField1.text!.isEmpty else { return }
    performSegue(withIdentifier: "segueTo2", sender: self)
}
委托方法实际上仅适用于硬连接的分段,因此可以将其删除


这更令人困惑!现在我意识到,在iOS中,如果我在按钮中输入if-else,我就不需要shouldPerformSegue。在macOS中,我需要shouldPerformSegue,我必须将if-else放在那里。如果我帮助解决了您的问题,请标记为答案。这有帮助,但不能解决问题。建议的答案不能解释我的情况。你的意思是在iOS中不需要执行segue吗?为什么它在macOS中是必需的?当您在代码中调用performsguewithidentifier时,不会调用shouldPerformSegue。为什么是否定点。我搜索了很多次,但没有人解释这一点。我需要做些什么来改进这个问题?iOS就是这样。为什么不使用macOS?正如我所说,如果我在macOS中只使用if或guard,即使文本字段为空,它也会使segue变为空。如果我使用我提到的所有代码,包括shouldPerformSegue,它将在所有情况下工作
  override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {

    let str: String? = textField1.text
    if str!.isEmpty {
          print ("text field is empty. Do not do the segue")
         return false
     }
     else {
         return true
     }
}