繁体   English   中英

以编程方式加载后,如何将数据传递给下一个视图控制器?

[英]How can I pass data to the next view controller when it is loaded programmatically?

假设我在Main.storyboard中有三个视图控制器。 这三个中的两个vc_loginvc_studyDesc使用带有'present modally'选项的UIButton加载另一个视图控制器。

另一个vc_signup具有UIButton,该UIButton可以返回到先前的控制器。 为此,我使用了以下方法:

vc_studyDesc的标识符为studyDesc 我让它将其标识符传递给vc_signup 同样, vc_loginlogin作为标识符。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if sender as! UIButton == qnaSignUp {
        let signup = segue.destinationViewController as! vc_signup
        signup.latestVC = "studyDesc"}}

这是在vc_signupUIViewController类中。 通过引用字符串latestVC ,该方法确定要继续运行的VC。

@IBAction func backBtnClick(sender: UIButton) {
    print("latestVS: \(latestVC)")
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier(latestVC)
    vc.modalTransitionStyle = UIModalTransitionStyle.CrossDissolve
    print("check check")
    self.presentViewController(vc, animated: true, completion: nil)}

我的问题是,当vc_studyDesc调用vc_signup时,应用程序终止。 我发现这是因为我错过了必须在vc_signup加载的重要变量。

vc_studyDesc有一些要从Firebase引用的数据。 我是通过从先前的vc加载一个变量postIDvc_studyDescvc_studyDesc 这是vc_list

所以我只是使用NSUserdefaults.standardUserDefaults()保存postID 它已解决,但我想知道是否有任何方法可以使用vc_signup使用的方式传递数据。

据我所知,我找不到任何将数据传递到vc_studyDesc.swift vc由其标识符选择。

我可以按我想要的方式传递想要的变量吗? 并添加标签将不胜感激!

因此,此设计存在两个问题。

当实例化一个viewController时,您将创建该类的新实例,并将其呈现出来将其添加到堆栈中。 可以将堆栈想象成一副纸牌,您从一张纸牌开始,然后添加或删除它们,最上面的纸牌是可见的vc。 当您回到studyDesc时,您将实例化并呈现它,因此您的堆栈中将有3个VC,其中两个是studyDesc(一个是您开始使用的,另一个是您尝试返回时添加的)

要从堆栈中删除VC,可以使用

dismissViewController(animated: true, completion: nil)

或者如果您在导航控制器中具有VC,则可以使用

popViewControllerController(animated: true, completion: nil)

就在viewController之间传递信息而言,如果该信息位于您用于呈现新控制器的VC中,则可以像已经使用的那样使用prepareForSegue。 要传回信息,您应该使用委托模式。 因此,在这种情况下要实现委托模式,您可以执行以下操作:

声明一个协议(不在您的类内部,在该类之上,但在您导入的之下)

protocol SignUpDelegate {
    signInCompleted(infoToPass: AnyObject)
}

然后让您的studyDesc类符合此协议并实现signInCompleted函数

StudyDescVC: UIViewController, SignUpDelegate {

    func signInCompleted(infoToPass: AnyObject) {
        // do what you want with the info here
    }

}

然后在您的signUpVc中添加一个var委托(将用于调用signInCompeleted函数)

class SignInVC: UIViewController {

    var delegate: SignUpDelegate!

    func finishedSigningIn() {
        delegate.signInCompleted(infoToPass: //yourinfo)
    self.dismissViewControllerAnimated(true, completion: nil)
}

然后在您的prepareForSegue中设置委托

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if sender as! UIButton == qnaSignUp {
    let signup = segue.destinationViewController as! vc_signup
    signup.delegate = self
    }
}
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier(latestVC) as! YOUR_VIEW_CONTROLLER_NAME
    vc.modalTransitionStyle = UIModalTransitionStyle.CrossDissolve
    vc.name = "Andrew"
    print("check check")
    self.presentViewController(vc, animated: true, completion: nil)


    //set a variale or property to your viewController

   class YOUR_VIEW_CONTROLLER_NAME: UIViewController {
    var name: String?

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM