如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭

Posted

技术标签:

【中文标题】如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭【英文标题】:How to pass second viewcontroller textfield value to first viewcontroller array and dismiss when button tapped in swift4 【发布时间】:2019-05-08 09:06:06 【问题描述】:

我有两个视图控制器,我想将第二个视图控制器文本字段值发送到第一个视图控制器数组并在点击按钮时关闭第二个视图控制器。

这是我的代码:

在第一个VC中:

我已经创建了数组:

var iteamsArr = [String]()

在第二个VC中:

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 中添加值 请帮帮我

【问题讨论】:

【参考方案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 中,首选更长更清晰的名称。

saveButton代替saveButn

addTextField代替addTf

createBussiness代替createBussnss

同时避免使用!,最好使用guard let text = textField.text else return

祝你好运! 更清晰、更好的代码。

【讨论】:

非常感谢,它真的很有帮助,我赞成并接受了你的回答,但我对 swift 很陌生,我有一个疑问.. 我应该在哪里创建 CreatePopUpDelegate CreatePopUpDelegate 可以在任何地方创建。在您的任何类或任何地方的定义之上。【参考方案2】:

您可以使用委托在两个控制器之间进行通信,现在在 swift 中我们甚至可以使用闭包来实现它们。 您需要在第二个 ViewController 中声明一个处理程序,例如:

var saveButtonHandler = ((_ handler: String?) -> Void)

在您将推送控制器的 FirstViewController 中,您可以像这样定义这个处理程序

secondViewController.saveButtonHandler = (text:String) in //append your text here to array

点击保存按钮

self.saveButtonHandler?(<Your_Text>)

【讨论】:

只需确保只在处理程序中使用String,不要使用secondViewController 的按钮或任何变量。您可能会陷入保留周期。

以上是关于如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何设置纵向和横向约束

仅在两个文本字段之一中的 Ipad 数字

导航控制器和记忆值

如何将第二个(隐藏)值添加到 datatables.net 中的单元格?

无法快速显示第一个视图控制器将值传递给第二个视图控制器

如何在第二个 ViewController 表格视图中使用模型快速显示第一个 ViewController 值