我想在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)
}
因此如何解决这个问题?
答案 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")//从父
加载