从容器视图传递值到父视图控制器

4

我是新手,想把一个数组从我的容器视图传递到父视图。我使用story board创建了容器视图,但容器视图会像下面所示一样在程序中出现和消失:

//in parent view controller, inside viewDidLoad()
CameraView.isHidden  = true

//in child view controller, on click of button,
let parent = self.parent as! DiaryEntryViewController
parent.CameraView.isHidden  = true

每当我点击按钮显示容器视图时,希望所选数据能够显示出来。 我不知道如何从子视图控制器传递值到父视图控制器,也不知道在哪里可以访问这些值。这些值需要在父视图控制器内的另一个按钮单击函数中访问。


1
使用协议与父视图控制器进行通信,并在其中标记委托。 - Sucharu Hasija
你能建议一下怎么做吗,最好附上一些代码。我对Swift还不熟悉。 - Geethanjali Reddy
2个回答

8
实现这一点的步骤如下。
  1. Your container view must contain a embed segue to the child view controller, name that segue something like this.... "homeToContainer" (See the attached Image) Add Embed segue name

  2. Add this method to your parent View controller (DiaryEntryViewController )

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let vc = segue.destination as? ChildViewController,
                segue.identifier == "homeToContainer" {
                vc.delegate = self
            }
    }
    
  3. Add Protocol and its variable in ChildViewController:

        protocol ChildToParentProtocol:class {
    
    
            func buttonClickedByUser()
            func needToPassInfoToParent(with value:Int)
    
        }
    
    
        class ChildViewController: UIViewController {
    
            weak var delegate:ChildToParentProtocol? = nil
    
            @IBAction func createTourPressed(_ sender: UIButton) {
                // Call here delegate methods to tell parent about the action
                delegate?.buttonClickedByUser()
    
            }
    
        }
    
  4. In the last in your parent ViewController, add this Extension:

            extension DiaryEntryViewController:ChildToParentProtocol {
    
                func buttonClickedByUser() {
    
                }
                func needToPassInfoToParent(with value:Int) {
    
    
                }
            }
    

可以不使用分段视图控制器来完成吗?也许可以通过编程实现? - Geethanjali Reddy
如果您在Storyboard中添加了一个容器视图,则必须通过segue进行连接。 - Sucharu Hasija
抱歉,我没有使用Storyboard添加它。我没有在任何地方添加容器视图。我只是将容器视图显示为隐藏或非隐藏状态。 - Geethanjali Reddy
我已经更新了我的答案,查看segue的截图,你是用同样的方式吗? - Sucharu Hasija
有没有一种方法可以在主控制器中使用从扩展程序获取的数据? - Geethanjali Reddy
显示剩余2条评论

1
如果您通过编程方式添加了容器视图,您应该使用回调从容器视图返回值到父视图。 父控制器:
let containerView = UIView()
containerView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(containerView)

NSLayoutConstraint.activate([
    containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
    containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0),
    containerView.topAnchor.constraint(equalTo: headerView.bottomAnchor, constant: 0),
    containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0),
    ])

let controller = YourViewController(nibName: "YourNibView", bundle: nil)

//This is important to get value back and also define callback to container view call as well
controller.callback = { result in
    self.isCardJoinedFromJoinScreen = true
    self.viewWillAppear(true)
}
addChild(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(controller.view)

NSLayoutConstraint.activate([
    controller.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
    controller.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
    controller.view.topAnchor.constraint(equalTo: containerView.topAnchor),
    controller.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)
    ])


容器视图控制器
定义此回调函数。
var callback : ((Bool)->())?

当您将值传递给父控制器时,请调用此回调函数:

self.callback?(true) or self.callback?(false)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接