我使用协议或代理从第二个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!)
}
}
答案 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)"
}
希望这有帮助。
我见过你在以下几行中使用了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)
}
这应该是正确的方法,而不是再次推动控制器。