有没有办法根据之前是不是在另一个视图控制器上按下按钮来编写 if 语句?

Posted

技术标签:

【中文标题】有没有办法根据之前是不是在另一个视图控制器上按下按钮来编写 if 语句?【英文标题】:Is there a way to write an if statement based on if a button was pressed on another view controller previously?有没有办法根据之前是否在另一个视图控制器上按下按钮来编写 if 语句? 【发布时间】:2019-01-22 04:17:17 【问题描述】:

我正在尝试创建一个计算器,向用户显示有关他们大学成绩的结果。用户点击按钮并根据他们的选择,UI 视图更新并显示下一个问题。我的代码一直有效,直到我需要它访问之前在不同视图控制器上选择的先前点击的按钮。我遇到的具体问题是在一个视图控制器上,用户可以选择是否想知道 Calculation1(与 sender.tag == 1 的顶部按钮相关联)或 Calculation2(底部按钮,sender.tag == 2)。无论按下哪个按钮,都会在新的视图控制器上对相同的问题执行 segue。回答完双方的问题后,只需按下一个按钮。我正在尝试为是否选择了 Calculation1(来自上一个 VC)编写一个 if 语句,然后将视图更新到下一个问题,如果选择了 Calculation2,则为下一个问题执行到另一个 VC 的 segue。我尝试使用布尔值的方式是作为以前 VC 的属性。 if 语句不起作用,相反,无论选择如何,都会发生相同的操作。

这是针对使用 Xcode 的带有 Swift 的 ios 应用程序。我试图创建一个布尔值作为属性,以便在点击 Calculation1 时,findCalc1 = true 然后在下一个 VC 中将该布尔值作为属性访问,但它不起作用。我还尝试为相互问题的转义准备一个布尔值,但它也不起作用。我觉得我对不同 VC 之间可以做什么和不可以做什么的理解存在差距。

//这是我第一个VC的代码

@IBAction func lightButtonPressed(_ sender: UIButton) 

        if sender.tag == 1 && lightViewPromptIndex == 1 

            desiredGpaText = textfield.text!
            performSegue(withIdentifier: "goToDarkButtonVC", sender: self)

            else if sender.tag == 2 && lightViewPromptIndex == 1 

            performSegue(withIdentifier: "goToDarkButtonVC", sender: self)

        

// 这是我的第二个 VC 的代码

@IBAction func darkButtonPressed(_ sender: Any) 

    if aboveTopPromptIndex == 1 && lightViewObject().findCalc1 == true 
        aboveTopTextPrompt.text = aboveTopPrompt2
        topTextfield.placeholder = "Ex: 76.00"
        besideTopTextLabel.isHidden = true
        underTopTextLabel.text = "course credits"
        aboveBottomTextPrompt.text = "that count toward my GPA."
        bottomTextfield.isHidden = true
        underBottomTextLabel.isHidden = true
        bottomFloatingLabel.isHidden = true
        darkButton.setTitle(nextTitle, for: .normal)
        aboveTopPromptIndex = 2
     else if aboveTopPromptIndex == 1 && lightViewObject().findCalc1 == false 
        performSegue(withIdentifier: "darkViewToABC", sender: TextfieldTwoLightButtonsViewController.self)

互问有aboveTopPromptIndex == 1。我想要发生的是,如果询问该问题并且之前选择了 Calculation1,则 if 语句中的第一块代码要运行......如果需要 Calculation2,则 else if 语句中的 segue 会发生。相反,无论按下哪个按钮,if 语句的第一部分都会发生,无论之前是否选择了 Calculation2。

【问题讨论】:

简单的答案是,你不应该分享你的状态。考虑有一个额外的状态对象并通过 segue 转换传递 【参考方案1】:

这个问题是关于将数据从一个视图控制器传递到另一个视图控制器。将数据从一个视图控制器传递到 另一个视图控制器,您可以使用 segue 的方法

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

用法:

将扩展添加到您的第一个视图控制器,即添加到您的 lightViewController

extension lightViewController 

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 
        if (segue.identifier == "goToDarkButtonVC") 
            let destVC = segue.destinationViewController as! darkViewController
            destVC. findCalc = sender as! Bool
        
    
    @IBAction func lightButtonPressed(_ sender: UIButton) 

         if sender.tag == 1 && lightViewPromptIndex == 1 

             desiredGpaText = textfield.text!
             // In the sender set the value as per your need....
             performSegue(withIdentifier: "goToDarkButtonVC", sender: true)

          else if sender.tag == 2 && lightViewPromptIndex == 1 
              // In the sender set the value as per your need....
              performSegue(withIdentifier: "goToDarkButtonVC", sender: true)
        
    

在您的第二个视图控制器中,像这样访问值:

class darkViewController : UIViewController 
    var findCalc = false 
    @IBAction func darkButtonPressed(_ sender: Any) 

        if aboveTopPromptIndex == 1 && self.findCalc1 == true 
          //TODO: add your handling code here....
        

这样您就可以轻松实现您的要求。

【讨论】:

【参考方案2】:

创建一个新对象 lightViewObject() 将创建一个新的内存块,它不会包含存储在前一个 viewController 中的值

为 segue 使用 Prepare 将数据从一个视图控制器传递到另一个视图控制器

class lightViewController : UIViewController 

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 
        if (segue.identifier == "goToDarkButtonVC") 
            let destVC = segue.destinationViewController as! darkViewController
            destVC.findCalc1 = true // change the value here
        
    
    @IBAction func lightButtonPressed(_ sender: UIButton) 

         if sender.tag == 1 && lightViewPromptIndex == 1 

             desiredGpaText = textfield.text!
             performSegue(withIdentifier: "goToDarkButtonVC", sender: self)

          else if sender.tag == 2 && lightViewPromptIndex == 1 

              performSegue(withIdentifier: "goToDarkButtonVC", sender: self)
        
    

然后使用darkViewController中的值

class darkViewController : UIViewController 
    var findCalc1:Bool = false 
    @IBAction func darkButtonPressed(_ sender: Any) 

        if aboveTopPromptIndex == 1 && self.findCalc1 == true 
           //Your Code here
        

【讨论】:

以上是关于有没有办法根据之前是不是在另一个视图控制器上按下按钮来编写 if 语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在不同的视图控制器上按下按钮来更改 tableview 数据?

按下视图控制器后删除“返回”按钮

在另一个选项卡上更改视觉效果

在使用方法创建的回收站视图项目上按下按钮

iOS 简单视图从导航堆栈错误弹出

在编辑模式下按下删除按钮时 UITableView 崩溃