如何以编程方式加载数据到下一个视图控制器?

时间:2016-10-02 05:36:46

标签: ios swift uiviewcontroller

假设我在Main.storyboard中有三个视图控制器。三个中的两个,geoNearvc_login使用UIButton加载另一个视图控制器,其中'存在模态'选项。

另一个vc_studyDesc有一个UIButton,它可能会返回到前一个控制器。为实现这一点,我使用了以下方法:

vc_signup的标识符为vc_studyDesc;我让它将其标识符传递给studyDesc。以同样的方式,vc_signupvc_login作为标识符。

login

这个位于override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if sender as! UIButton == qnaSignUp { let signup = segue.destinationViewController as! vc_signup signup.latestVC = "studyDesc"}} 的{​​{1}}课程中。通过引用字符串UIViewController,该方法确定要继续运行的VC。

vc_signup

我遇到的问题是,当latestVC调用@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有一些数据在加载时从Firebase引用。我是通过将前一个vc中的变量vc_signup加载到vc_studyDesc来完成此操作的。这是postID

所以我刚刚使用vc_studyDesc保存vc_list。它已经解决,但我想知道是否有任何方法可以使用我在postID中使用的方式传递数据。

据我所知,我找不到任何方法将数据传递到NSUserdefaults.standardUserDefaults();因为vc是由其标识符选择的。

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

2 个答案:

答案 0 :(得分:1)

因此这种设计存在一些问题。

当您实例化viewController时,您正在创建该类的新实例,并将其添加到堆栈中。想象堆栈就像一副牌,你从一张牌开始然后添加或删除它们,顶牌是可见的vc。当您返回studyDesc时,您正在实例化并呈现它,因此您的堆栈中将有3个VC,其中两个是studyDesc(您开始使用的那个以及您尝试返回时添加的那个)

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

dismissViewController(animated: true, completion: nil)

或者如果您在导航控制器中安装了VC,则可以使用

popViewControllerController(animated: true, completion: nil)

在viewControllers之间传递信息方面,如果信息在用于呈现新控制器的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
    }
}

答案 1 :(得分:0)

    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?

}