假设我在 Main.storyboard 中有三个 View Controller 。这三个中的两个,vc_login
和 vc_studyDesc
使用带有“present modally”选项的 UIButton 加载另一个 View Controller 。
另一个vc_signup
有一个UIButton,可能会回到之前的controller。为了实现这一点,我使用了以下方法:
vc_studyDesc
有一个标识符studyDesc
;我让它将其标识符传递给 vc_signup
。同样,vc_login
将 login
作为标识符。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if sender as! UIButton == qnaSignUp {
let signup = segue.destinationViewController as! vc_signup
signup.latestVC = "studyDesc"}}
这个在 vc_signup
的 UIViewController
类中。通过引用字符串 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 加载一个变量 postID
到 vc_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/