【问题标题】:Passing data to child container view将数据传递给子容器视图
【发布时间】:2017-06-16 12:12:15
【问题描述】:

我想在 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)
    }

所以这个错误会显示:

如何解决这个问题?

【问题讨论】:

  • 请按部就班,不要直接传数据,先尝试加载视图(添加子视图)。如果成功,则传递数据,尝试修改代码 var myStr:String!到 var myStr:String?。我确信你的代码是正确的,只是你缺少一些可选的东西。
  • 请正确格式化您的代码。至少检查它是否正确设置。有很多问题我可以识别。两个类都没有左括号,不存在对 super.viewDidAppear 的调用,代码对齐,函数之间的空格,强制展开是邪恶的......等等
  • 我建议在 ChildViewController viewDidAppear 的第一行添加super.viewDidAppear(animated)。我不认为这会导致崩溃。
  • 尝试在 childVCs viewDidAppear 中添加 super.viewDidAppear(animated),由 @MobileDan 建议
  • 我认为didMove(toParentViewController: vc) 应该是didMove(toParentViewController: self)

标签: ios swift swift3 uicontainerview


【解决方案1】:

无论写什么都是正确的,都只是缺少故事板成为焦点的一个主要内容,因为故事板中的 ChildViewController 已经使用嵌入 seague 嵌入到 ContainerView 中,它会自动将此 vc 加载到容器,并且应用程序崩溃了,因为“myStr”在为 nil 时被强制解包

我已经写了 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 中,为什么要声明变量不是可选的,

  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 //从情节提要中加载

Str is: Optional("Hello Bro") // 从父级加载

【讨论】:

    【解决方案2】:

    此代码包含在 cmets 中提出的建议,并且不使用强制展开。

    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)")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-01
      • 2015-12-02
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多