我有两个视图控制器,我想将第二个viewcontroller文本字段值发送到第一个viewcontroller数组,并在点击按钮时关闭第二个viewcontroller。
这是我的代码:
在firstVC中:
我创建了数组:
var iteamsArr = [String]()
在secondVC中:
class CreatePopUpViewController: UIViewController {
var popData: String?
var createBussnss = CreateBusinessViewController()// is my firstVC name
@IBOutlet weak var addTf: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func saveButn(_ sender: Any) {
createBussnss.iteamArray.append(addTf.text!)
dismiss(animated: true, completion: nil)
}
}
在这里关闭了viewcontroller,但是没有将值添加到第一个viewcontroller中的arry中 请帮助我
答案 0 :(得分:1)
使用委托。
protocol CreatePopUpDelegate: class {
func createPopUpDidSaveTextFieldPick(_ value: String)
}
然后在第一个视图控制器中:
extension FirstViewController: CreatePopUpDelegate {
func createPopUpDidSaveTextFieldPick(_ value: String) {
print ("first view controller now has value of textfield")
// add it to array or whatever
}
然后在第二个视图控制器中:
class CreatePopUpViewController: UIViewController, MyDelegate {
weak var delegate: CreatePopUpDelegate?
@IBAction func saveButn(_ sender: Any) {
createBussnss.iteamArray.append(addTf.text!)
delegate?.createPopUpDidSaveTextFieldPick(addTf.text!)
dismiss(animated: true, completion: nil)
}
您只需在代码中的某个地方做
:secondViewController.delegate = firstViewController.
在这种情况下,secondViewController
是从firstViewController
实例化并显示的,因此您可以这样做:
secondViewController.delegate = self
此外,作为一般性建议,请准备《 Swift代码准则》。在Swift中,更清晰的名称是首选。
执行saveButn
而不是saveButton
。
执行addTf
而不是addTextField
。
执行createBussnss
代替createBussiness
也要避免做!
,最好不要做guard let text = textField.text else { return
。
祝你好运! 更清晰,更好的代码。
答案 1 :(得分:0)
您可以使用委托在两个控制器之间进行通信,现在,我们甚至可以对相同的控件使用闭包。 您需要在第二个ViewController中声明一个处理程序,例如:
var saveButtonHandler = ((_ handler: String?) -> Void)
在要推送控制器的FirstViewController中,您可以像这样定义处理程序
secondViewController.saveButtonHandler = { (text:String) in
//append your text here to array
}
然后点击保存按钮
self.saveButtonHandler?(<Your_Text>)