0

我曾尝试查看与此类似的问题的答案,但我不是特别有经验,并且在关注它们时遇到了麻烦,因此非常感谢任何帮助!我的情况如下:当我在Parent ViewController中按下一个按钮时,下面的代码用于调用一个Child ViewController(顺便说一下,Child实际上是一个TableViewController,但它似乎工作正常“认为”这是一个正常的视图控制器?):

controller = (storyboard?.instantiateViewController(withIdentifier: "People"))
addChildViewController(controller!)
controller?.view.frame = CGRect(x: 10, y: 200, width: 394, height: 300)
self.view.addSubview((controller?.view)!)
controller?.didMove(toParentViewController: self)

然后我想要将一个数组从父级传输到子级,它将用作 TableView 的数据?

其次,当我从 Child 的 TableView 中选择一个单元格时,我希望将相关信息发送给 Parent,并让 Child 消失。
如果有兴趣,我已经设法在不同的情况下关闭子项(当显示子项时在父项中发生点击时),使用以下方法:

controller?.willMove(toParentViewController: nil)
controller?.view.removeFromSuperview()
controller?.removeFromParentViewController()

我真的很感激任何建议,即使它是指向有用的东西的链接!

4

3 回答 3

1

尝试这个。

首先为添加和删除 childVC 创建公共方法。

对于添加 childVC。

public class func openChildViewController(parentVC:UIViewController, with childVC:UIViewController){

        parentVC.addChildViewController(childVC)
        childVC.view.frame = parentVC.view.frame
        parentVC.view.addSubview(childVC.view)
        parentVC.didMove(toParentViewController: childVC)
    }

对于删除 childVC。

   public class func removeChildViewController(childVC:UIViewController){

        childVC.willMove(toParentViewController: nil)
        childVC.view.removeFromSuperview()
        childVC.removeFromParentViewController()
    }

使用上述方法。

1.ParentVC.swift

class ParentVC: UIViewController , ChildVCDelegate  {

     var arrType = NSMutableArray()

    //add ChildVC
    @IBAction func btnAddChildVC(_ sender: UIButton) {
        let ChildVC = self.storyboard?.instantiateViewController(withIdentifier: "ChildVC") as! ChildVC
        PickerVC.arrPass = arrType //for data passing create any object in ChildVC for ex. arrPass is NSMutableArray
        ChildVC.delegate = self
        openChildViewController(parentVC: self, with: ChildVC)
    }

     // MARK: ChildVC Delegate
   func SetSelectedPickerValue(strSelectOption: String) {
                print(strSelectOption)
        }
    }

}

2.ChildVC.swift

class ChildVC: UIViewController{

    // MARK: Variable for ParentVCData Passing
     var arrPass = NSMutableArray()

    override func viewWillAppear(_ animated: Bool) {
        print(arrPass)
    }

    //Remove ChildVC
    @IBAction func btnRemoveChildVC(_ sender: UIButton) {
        self.delegate?.SetSelectedPickerValue!(strSelectOption: “any String you pass ChildVC To ParentVC”)
        removeChildViewController(childVC: self)
    }
}
// MARK: Create Delegate Method
@objc protocol ChildVCDelegate{
     @objc optional func SetSelectedPickerValue(strSelectOption:String)
}
于 2017-09-13T12:00:19.563 回答
1

您可以像这样将值从父控制器传递给子控制器

controller = (storyboard?.instantiateViewController(withIdentifier: "People"))
    addChildViewController(controller!)
    controller?.view.frame = CGRect(x: 10, y: 200, width: 394, height: 300)
    controller.tableDataSource = // Pass your required value to child controller
    self.view.addSubview((controller?.view)!)
    controller?.didMove(toParentViewController: self)

现在您想将您的选择值传输回父视图控制器。为此,您可以在 ChildController 中创建一个委托,例如

@protocol ChildControllerDelegate : class {
    func selectedValue(Value : String)
}

之后,像这样在 ChildController 中创建该委托的变量

weak var delegate : ChildControllerDelegate?

并且在 rowDidSelect 方法中添加以下代码

if(delegate != nil) {
   delegate.selectedValue(Value :"Your selected value")
}

现在,当您要从 ParentController 显示 ChildController 时,您必须delegate像这样将该对象设置为 ParentController

controller = (storyboard?.instantiateViewController(withIdentifier: "People"))
    addChildViewController(controller!)
    controller?.view.frame = CGRect(x: 10, y: 200, width: 394, height: 300)
    controller.delegate = self
    self.view.addSubview((controller?.view)!)
    controller?.didMove(toParentViewController: self)

然后像这样在 ParentController 中实现委托方法

func selectedValue(Value : String) {
   // you select val 
}
于 2017-09-13T11:33:08.907 回答
0

你可以:

  • controller子视图控制器转换为适当的类(我在ChildViewController下面使用,但希望您有一个更具描述性的名称);和

  • 将当前视图控制器(父级)中的数组(我猜你可能调用过people,但使用这两个各自的视图控制器中的数组名称)传递给这个新的子视图控制器。

因此:

let child = storyboard!.instantiateViewController(withIdentifier: "People") as! ChildViewController
addChildViewController(child)
child.people = people
child.view.frame = ...
view.addSubview(child.view)
child.didMove(toParentViewController: self)

就个人而言,我不会像您在原始问题中那样对子坐标进行硬编码。我会设置translatesAutoresizingMaskIntoConstraints然后false添加适当的前导/尾随/顶部/底部约束,但这取决于你。在您的示例中看到硬编码的坐标太痛苦了。

于 2017-09-13T11:53:45.877 回答