将数据从第二个VC传递到第一个VC,并在文本字段Swift4中显示

时间:2018-05-04 09:40:05

标签: ios swift swift4

我使用协议或代理从第二个VC获取数据到第一个VC,数据在第一个VC中接收,但问题是数据未在Textfield中显示。这是我完整的理解代码。非常感谢。

FirstVC类

import UIKit

class firstViewController: UIViewController, UITextFieldDelegate, MyProtocol {

var valueSentFromSecondViewController               : String?
@IBOutlet weak var myTextField                      : UITextField!

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

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func myTextFieldACTIONWhenEditingDidBegin(_ sender: Any) {
    myTextField.isUserInteractionEnabled = false
    let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as! secondViewController

    secondVC.delegate = self
    self.navigationController?.pushViewController(secondVC, animated: true)
}

func setResultsAfterEvaluation(valueSent: String) {
    self.valueSentFromSecondViewController = valueSent
    print(valueSentFromSecondViewController!) // Ahtazaz(DATA showing here)
    myTextField.text = valueSentFromSecondViewController //This's the problem, Why not showing here in this this TextField
}
}

现在,SecondVC Class

import UIKit

protocol MyProtocol {
func setResultsAfterEvaluation(valueSent: String)

}

class secondViewController: UIViewController {

var delegate            :   MyProtocol?
var sentValue           :   String?

override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func btn(_ sender: Any) {
    let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController
    self.navigationController?.pushViewController(firstVC, animated: true)

    sentValue = "Ahtazaz"
    delegate?.setResultsAfterEvaluation(valueSent: sentValue!)
}

}

2 个答案:

答案 0 :(得分:0)

步骤很简单,可以使用Delegates将数据传递给以前的VC

第二个VC:

在VC的顶部声明协议如下:

protocol MenuListingDelegate {
func callBackOfMenuSelected(arrSelectedCategory:[Int],isFromWhichPopup:Int)

}

然后在里面定义像这样的variable

var delegate:MenuListingDelegate?

然后像这样向代表提供数据。在我的情况下,我在弹出View Controller

之前单击 button
self.delegate?.callBackOfMenuSelected(strToPass: "Hello")

现在在第一个VC:

在顶部定义Delegate方法,如下所示:

class DayDetailVC: UIViewController,MenuListingDelegate {}

然后像这样获取数据

  //MARK:- Menu Listing Delegate

    func callBackOfMenuSelected(strToPass: String) {
     print(strToPass)

    }
  

注意: - 不要忘记声明我们使用它的第二个VC的委托。 secondVC.delegate = self

编辑检查以下情况

案例1: - 检查myTextField的出口我想问题就在那里。如果一切正确,请删除Outlet和再次设置

案例2: - 如果不起作用,请尝试像这样设置

func setResultsAfterEvaluation(valueSent: String) {
myTextField.text = "\(valueSent)" 
}

希望这有帮助。

编辑2

我见过你在以下几行中使用了pushViewController: 因此,您只需使用以下代码行将数据传递给 firstVC

即可

SecondVC 中添加以下代码:

 let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController
firstVC.valueSentFromSecondViewController = "Hello World"
self.navigationController?.pushViewController(firstVC, animated: true)

现在在 FirstVC

viewDidLoad()或任何你想要的地方使用

print(valueSentFromSecondViewController) //Hello World

干得好。

选择您想要的方式。

  

注意: - 但我建议您使用popViewController代替   从 SecondVC返回时返回pushViewController - > FirstVC 即可。休息取决于您的要求。

希望这有帮助。

答案 1 :(得分:0)

你正在推动SecondVC。然后在SecondVC中你再次推动FirstVC。 我认为这是你犯错误的地方。

let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController

您正在创建FirstVC的新实例。然后你推它错了。调用您的代理,然后弹回到上一个(FirstVC)控制器

在按钮操作中尝试此代码

@IBAction func btn(_ sender: Any) {
sentValue = "Ahtazaz"
delegate?.setResultsAfterEvaluation(valueSent: sentValue!)
self.navigationController?.popViewController(animated: true)
}

这应该是正确的方法,而不是再次推动控制器。