将数据传递到子容器视图

时间:2017-01-31 06:35:19

标签: ios swift swift3 uicontainerview

我想在swift 3中将字符串数据从父vc传递给子vc 我的孩子vc是容器视图。所以看我的代码:

class ParentViewController: UIViewController
@IBOutlet var continerView: UIView!
override func viewDidLoad() {
        super.viewDidLoad()
let vc = storyboard?.instantiateViewController(withIdentifier: "ChildVCID") as! ChildViewController!
        vc?.myStr = "Hello Bro"
        addChildViewController(vc!)
        continerView.addSubview((vc?.view)!)
        didMove(toParentViewController: vc)
}
}  

我的孩子代码是:

class ChildViewController: UIViewController
 var myStr:String!
override func viewDidLoad() {
        super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
        print("Str is: ",myStr)
    }

所以这个错误会显示:
enter image description here

因此如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

此代码包含注释中提出的建议,不使用强制解包。

class ParentViewController: UIViewController {
    @IBOutlet var continerView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let childViewController = storyboard?.instantiateViewController(withIdentifier: "ChildVCID") as? ChildViewController else {
            print("Creating ViewController from ChildVCID failed")
            return
        }

        childViewController.myStr = "Hello Bro!"
        addChildViewController(childViewController)
        continerView.addSubview(childViewController.view)
        didMove(toParentViewController: self)

    }
}

class ChildViewController: UIViewController {
    var myStr:String?

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("Str is: ", myStr ?? "(nil)")
    }
}

答案 1 :(得分:0)

无论写的是什么都是正确的,所有都只是缺少一个故事板成为焦点的主要事情,因为故事板中的ChildViewController已经嵌入到带有嵌入式的ContainerView 中,它会自动将此vc加载到容器,应用程序崩溃,因为myStr' 强行打开,而没有

我写过ParentViewController,最小的'!' &安培; '?',为什么在不需要的时候使用它们。

 class ParentViewController: UIViewController{
    @IBOutlet var cv: UIView!
    override func viewDidLoad() {
     super.viewDidLoad()
     let storyBoard = UIStoryboard(name: "Main", bundle: nil)
     let vc = storyBoard.instantiateViewController(withIdentifier: "idChildViewController") as! ChildViewController
     vc.myStr = "Hello Bro"
     addChildViewController(vc)
     cv.addSubview(vc.view)
     didMove(toParentViewController: vc)
    }
   }
 }

现在,在ChildViewController中,为什么声明varible不是可选的,

  class ChildViewController: UIViewController
   var myStr:String?  // or var myStr = "" //best way to declare string 
   override func viewDidLoad() {
       super.viewDidLoad()
   }
   override func viewDidAppear(_ animated: Bool) {
      print("Str is: ",myStr)
   }

运行应用程序,将控制台输出两次,

Str is:nil //从storyboard

加载

Str is:可选(" Hello Bro")//从父

加载