gpt4 book ai didi

ios - 在 childViewController 之间传递数据 Swift

转载 作者:行者123 更新时间:2023-11-30 11:28:27 25 4
gpt4 key购买 nike

我在我的 MainViewController 中放置了一个容器。然后在该容器内添加FirstViewController

let containerView = UIView()
view.addSubview(containerView)

let controller = FirstViewController()
addChildViewController(controller)
containerView.addSubview(controller.view)

controller.didMove(toParentViewController: self)

FirstViewController 内有一个 UITextField 和一个 UIButtonSecondViewControllervar PassedText = "" 内部有一个标签来更新 UILabel 文本。我只想在按下 UIButton 时根据 FirstViewController 中的 UITextField 文本设置 UILabel 文本,并且它也应该导致 SecondViewController 。这是来自 FirstViewController 的 UIButton 操作方法。我没有使用 Storyboard

@IBAction func btnPressed(_ sender: Any) {
let secondVC = SecondViewController()
addChildViewController(secondVC)
view.addSubview(secondVC.view)

secondVC.view.frame = view.bounds
secondVC.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

secondVC.didMove(toParentViewController: self)
secondVC.passedText = inputTextField.text!
}

这是FirstViewController

class FirstViewController: UIViewController {

@IBOutlet weak var inputTextField: UITextField!

let secondVC = SecondViewController()

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

@IBAction func btnPressed(_ sender: Any) {
addChildViewController(secondVC)
view.addSubview(secondVC.view)

secondVC.view.frame = view.bounds
secondVC.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

secondVC.didMove(toParentViewController: self)
secondVC.passedText = inputTextField.text!
}
}

这是SecondViewController

class SecondViewController: UIViewController {

var passedText = ""

@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
super.viewDidLoad()

label.text = passedText
}
}

最佳答案

Closure

class ParentViewController: UIViewController {

var embeddedViewController: UIViewController?

override func viewDidLoad() {
super.viewDidLoad()

let firstViewController = FirstViewController()
embedViewController(firstViewController)
firstViewController.passDataClosure = { [weak self] text in
let secondViewController = SecondViewController()
self?.embedViewController(secondViewController)
secondViewController.passedText = text
}
}

func embedViewController(_ viewController: UIViewController) {
removeEmbedded()
viewController.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
addChildViewController(viewController)
view.addSubview(viewController.view)
viewController.didMove(toParentViewController: self)
embeddedViewController = viewController
}

func removeEmbedded() {
embeddedViewController?.view.removeFromSuperview()
embeddedViewController?.didMove(toParentViewController: nil)
embeddedViewController?.removeFromParentViewController()
}
}

-

class FirstViewController: UIViewController {

var passDataClosure: ((String?) -> Void)?

@IBOutlet weak var inputTextField: UITextField!

@IBAction func btnPressed(_ sender: Any) {
passDataClosure?(inputTextField.text)
}
}

-

class SecondViewController: UIViewController {

var passedText: String? {
didSet {
label.text = passedText
}
}

@IBOutlet weak var label: UILabel!
}

Delegate

class ParentViewController: UIViewController, FirstViewControllerDelegate {

var embeddedViewController: UIViewController?

override func viewDidLoad() {
super.viewDidLoad()

let firstViewController = FirstViewController()
embedViewController(firstViewController)
firstViewController.delegate = self
}

func embedViewController(_ viewController: UIViewController) {
removeEmbedded()
viewController.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
addChildViewController(viewController)
view.addSubview(viewController.view)
viewController.didMove(toParentViewController: self)
embeddedViewController = viewController
}

func removeEmbedded() {
embeddedViewController?.view.removeFromSuperview()
embeddedViewController?.didMove(toParentViewController: nil)
embeddedViewController?.removeFromParentViewController()
}

// MARK: FirstViewControllerDelegate
func firstViewController(_ firstViewController: FirstViewController, pass text: String?) {
let secondViewController = SecondViewController()
embedViewController(secondViewController)
secondViewController.passedText = text
}
}

-

class SecondViewController: UIViewController {

var passedText: String? {
didSet {
label.text = passedText
}
}

@IBOutlet weak var label: UILabel!
}

-

protocol FirstViewControllerDelegate: class {
func firstViewController(_ firstViewController: FirstViewController, pass text: String?)
}

class FirstViewController: UIViewController {

weak var delegate: FirstViewControllerDelegate?

@IBOutlet weak var inputTextField: UITextField!

@IBAction func btnPressed(_ sender: Any) {
delegate?.firstViewController(self, pass: inputTextField.text)
}
}

关于ios - 在 childViewController 之间传递数据 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50487322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com