-1

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

编辑

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

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

3 回答 3

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

于 2020-06-21T18:56:47.500 回答
0

有2种方法:

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

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

于 2020-06-21T18:05:06.237 回答
-1

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

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

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

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

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

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

Step3: 在类方法中使用委托将数据发送给接收方法,即任何采用该协议的方法。

@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 和代表

如果您对代表的幕后发生的事情感兴趣,我确实在这里写过:

在与代表的幕后

原始答案

于 2020-06-21T13:13:53.363 回答