2017-09-13 3 views
0

나는 이와 비슷한 질문에 대한 답을 찾으려고 노력했지만 특히 경험이 없으며 그 다음에 문제가있어 도움이 될 것입니다! 내 상황은 다음과 같습니다 : 부모 ViewController 단추를 누르면 다음 코드는 Child ViewController를 호출하는 데 사용됩니다 (단, Child는 실제로 TableViewController이지만 괜찮 았던 것처럼 보입니다) 의 ViewController는) :부모와 자식보기 컨트롤러간에 데이터를 전송하는 방법

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 's TableView에서 셀을 선택하면 관련 정보를 부모에게 보내고 Child가 사라지도록하고 싶습니다.

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

난 정말 어떤 조언을 부탁드립니다 : 그것은 관심의 경우
, 나는 (클릭이 아동이 표시되는 동안 부모에 발생하면) 다음과 같은 사용하여 서로 다른 상황에서 아동을 닫습니다 관리해야 , 비록 그것이 도움이 될만한 것에 대한 링크 일지라도!

+1

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. 'addChildViewController (controller!)'행 다음에'controller.array = self.array'를 추가하면됩니다. 반환하려면 대리자 메서드를 사용할 수 있습니다. – CoderFrom94

+0

'parentsViewVontroller'와'parentsViewVontroller's' 인스턴스의 속성을'childViewController'로 만들고 값을이 변수에 전달하거나'childViewController'의 델리게이트를 만들고 이벤트를 다시받을 수 있습니다. 그렇지 않으면 블록을 사용할 수 있습니다. – TheTiger

답변

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) 

지금 당신이 부모 뷰 컨트롤러로 선택 값을 다시 전송하려면 다음과 같이 아동 컨트롤러 부모로부터 값을 전달할 수 있습니다. 이러한 목적을 위해 당신은이

weak var delegate : ChildControllerDelegate? 

처럼 ChildController에 그 위임의 변수를 확인하고 rowDidSelect 방법에 코드

if(delegate != nil) { 
    delegate.selectedValue(Value :"Your selected value") 
} 
에게 다음과 같은 추가 할 때 한 후이

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

같은 ChildController의 위임을 만들 수 있습니다

이제 그 단계에서 ParentController의 ChildController를 표시하려고 할 때 delegate 개체를 ParentController l로 설정해야합니다. 이케이

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) 

하고 그냥

func selectedValue(Value : String) { 
    // you select val 
} 
+0

훌륭하게, 완벽하게 작동했습니다. 감사합니다. – jasperthedog

0

처럼 ParentController의 대리자 메서드를 구현 한 후에 할 수 있습니다

  • 캐스트 아이 뷰 컨트롤러에 적절한 클래스에 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) 

, 나는 코드 하드 않을 것 당신이 원래의 질문에 그랬던 것처럼 아이가 조정합니다. translatesAutoresizingMaskIntoConstraintsfalse으로 설정 한 다음 적절한 선행/후행/위/아래 제약 조건을 추가합니다. 그러나 이는 귀하에게 달려 있습니다. 당신의 예제에서 하드 코드 된 좌표를 보는 것은 너무 고통 스러웠습니다.

+0

조언 해 주셔서 감사합니다! 일을 먼저 수행 한 다음에 자동 크기 지정을 넣을 예정이었습니다 (이 작업에 매우 익숙하므로 잘 할 수있는 방법이 아닐 수도 있습니다!). – jasperthedog

0

시도해보십시오.

먼저 public 메서드를 추가하고 제거하기위한 childVC를 만듭니다.

For add 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 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) 
} 
관련 문제