ios - 在 childViewController 之间传递数据 Swift

标签 ios swift

我在我的 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/

相关文章:

java - Swift 或 Objective C 中的 java ByteBuffer 等价于什么?

ios - 强制 UIImagePickerController 裁剪方形图像

ios - 如何检查用户是否在 Twitter 上关注您?

ios - 为什么我的函数输出一个看起来像内存地址的随机值?

ios - 如何以相同的捏合速度缩放 videoZoomFactor

ios - SwiftUI - 类型 'Text' 的值没有成员 'color' 错误

swift - 在 Swift 中的 tableview 行之间拆分 JSON 响应的问题

ios - 西类牙语支持重拍和使用 UIImagePickerController 的照片按钮

ios - Lib 工具无法创建存档

ios - Phonegap - 第一个应用程序