ios - 以编程方式加载数据时,如何将数据传递给下一个 View Controller ?

标签 ios swift uiviewcontroller

假设我在 Main.storyboard 中有三个 View Controller 。这三个中的两个,vc_loginvc_studyDesc 使用带有“present modally”选项的 UIButton 加载另一个 View Controller 。

另一个vc_signup有一个UIButton,可能会回到之前的controller。为了实现这一点,我使用了以下方法:

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_signup 调用 vc_studyDesc 时,应用程序会终止。我发现这是因为我错过了一个必须在 vc_signup 中加载的重要变量。

vc_studyDesc 有一些数据在加载时从 Firebase 中引用。我通过从之前的 vc 加载一个变量 postIDvc_studyDesc 来做到这一点;这是 vc_list

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

据我所知,我找不到任何方法将数据传递到 vc_studyDesc.swift;因为 vc 是由它的标识符选择的..

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

最佳答案

所以这个设计有几个问题。

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

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

dismissViewController(animated: true, completion: nil)

或者如果您在导航 Controller 中有 VC,您可以使用

popViewControllerController(animated: true, completion: nil)

就在 viewController 之间传递信息而言,如果信息在您用来展示新 Controller 的 VC 中,您可以像已有的那样使用 prepareForSegue。要传回信息,您应该使用委托(delegate)模式。因此,要在这种情况下实现委托(delegate)模式,您需要执行以下操作:

声明一个协议(protocol)(不在你的类中,在你的类之上但在你的导入之下)

protocol SignUpDelegate {
    signInCompleted(infoToPass: AnyObject)
}

然后让你的 studyDesc 类符合这个协议(protocol)并实现函数 signInCompleted

StudyDescVC: UIViewController, SignUpDelegate {

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

}

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

class SignInVC: UIViewController {

    var delegate: SignUpDelegate!

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

然后在您的 prepareForSegue 中设置委托(delegate)

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

关于ios - 以编程方式加载数据时,如何将数据传递给下一个 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39814176/

相关文章:

iphone - 如果我们将其添加到其他对象,该值如何保留

ios - 如何减小 iPad 板载键盘的尺寸?

Swift:切换 View 后使用 UILongPressGestureRecognizer 时应用程序崩溃

ios - 在swift中将容器 View 分成2个 Controller

ipad - 当键盘出现在带有 iOS8 的 iPad 上时,将模态呈现的 UIViewController 向上移动

ios - UIViewController 旋转 View 但不调整它的大小

ios - 以编程方式添加以查看时,UISlider 使应用程序崩溃

ios - 在 uiwindow subview 之上呈现 View Controller

ios - Facebook SDK swift : problems with fetching user data (segue)

ios - addChildViewController View 不显示