【问题标题】:Using button in another view controller在另一个视图控制器中使用按钮
【发布时间】:2020-06-21 12:30:59
【问题描述】:

这个问题可能已经被问到关于隐藏按钮的问题,但我想知道我是否可以只单击一个会影响另一个视图控制器中的变量的按钮。例如,我有 firstViewController 和 endViewController。 endViewController 中有一个按钮,用户按下它应该会更改 firstViewController 中的变量。有没有办法从 firstViewController 访问 endViewController 按钮?

编辑

到目前为止,除了控制将 endViewController 按钮单击到 firstViewController 中之外,我还没有尝试太多(这不起作用)。

class firstViewController: UIViewController {
    @IBAction func nextButton(_ sender: Any) { //button that sits in endViewController
    
    }
}

【问题讨论】:

  • 到目前为止您尝试过什么?包含您的代码
  • @jawadAli 对我的帖子的编辑是否足够?谢谢!

标签: ios swift uivewcontroller


【解决方案1】:

第一个视图控制器

第一个视图控制器的代码是

import UIKit

class FirstViewController: UIViewController, DataEnteredDelegate {

@IBOutlet weak var label: UILabel!

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showSecondViewController" {
        let secondViewController = segue.destinationViewController as! SecondViewController
        secondViewController.delegate = self
    }
}

func userDidEnterInformation(info: String) {
    label.text = info
}
}

注意我们自定义的 DataEnteredDelegate 协议的使用。

第二视图控制器和协议

第二个视图控制器的代码是

import UIKit

// protocol used for sending data back
protocol DataEnteredDelegate: class {
func userDidEnterInformation(info: String)
}

class SecondViewController: UIViewController {

// making this a weak variable so that it won't create a strong reference cycle
weak var delegate: DataEnteredDelegate? = nil

@IBOutlet weak var textField: UITextField!

@IBAction func sendTextBackButton(sender: UIButton) {
    
    // call this method on whichever class implements our delegate protocol
    delegate?.userDidEnterInformation(textField.text!)
    
    // go back to the previous view controller
    self.navigationController?.popViewControllerAnimated(true)
}
}

请注意,该协议位于 View Controller 类之外。

就是这样。现在运行应用程序,您应该能够将数据从第二个视图控制器发送回第一个。

原帖:https://stackoverflow.com/a/33229483/13783496

【讨论】:

    【解决方案2】:

    有两种方法:

    1. 您可以创建从 endviewcontroller 中的按钮到情节提要中的 firstviewcontroller 的 segue。您可以为其配置 func prepare(for segue: UIStoryboardSegue, sender: Any?)。 让 endVC = endViewcontroller() endVC.color = "蓝色"

    2. 您可以将需要更改其值的变量保留为静态数据类型。 在按钮的单击操作中,您可以访问变量为, EndViewController.color = "红色"。 请仅在您希望其他 Viewcontroller 直接访问静态变量时使用它。

    【讨论】:

      【解决方案3】:

      您可以使用 DELEGATE PATTERN 传回数据:

      以下是关于两个视图控制器之间的委托的一点帮助:

      第 1 步:在 UIViewController 中创建一个协议,您将删除/发送数据。

      protocol FooTwoViewControllerDelegate:class {
          func myVCDidFinish(_ controller: FooTwoViewController, text: String)
      }
      

      Step2:在发送类(即UIViewcontroller)中声明委托

      class FooTwoViewController: UIViewController {
          weak var delegate: FooTwoViewControllerDelegate?
          [snip...]
      }
      

      第三步:在类方法中使用委托将数据发送给接收方法,接收方法可以是任何采用协议的方法。

      @IBAction func saveColor(_ sender: UIBarButtonItem) {
              delegate?.myVCDidFinish(self, text: colorLabel.text) //assuming the delegate is assigned otherwise error
      }
      

      第四步:在接收类中采用协议

      class ViewController: UIViewController, FooTwoViewControllerDelegate {
      

      第 5 步:实现委托方法

      func myVCDidFinish(_ controller: FooTwoViewController, text: String) {
          colorLabel.text = "The Color is " +  text
          controller.navigationController.popViewController(animated: true)
      }
      

      第 6 步:在 prepareForSegue 中设置委托:

      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
          if segue.identifier == "mySegue" {
              let vc = segue.destination as! FooTwoViewController
              vc.colorString = colorLabel.text
              vc.delegate = self
          }
      }
          
      

      这应该可行。这当然只是代码片段,但应该给你的想法。有关此代码的详细说明,您可以在此处转到我的博客条目:

      segues and delegates

      如果您对我在此处写过的代表的幕后情况感兴趣:

      under the hood with delegates

      original answer

      【讨论】:

      • 可以给原作者署名stackoverflow.com/a/25792213/4085910
      • 我可以向后发送一个 segue(从 secondViewController 到 firstViewController)吗?
      • 你知道segue是什么吗?你想达到什么目的?你想回去还是什么? @DeadlyElmo
      • 我明白了。无论如何谢谢@SwiftiSwift
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多