假设我在Main.storyboard中有三个视图控制器。三个中的两个,geoNear
和vc_login
使用UIButton加载另一个视图控制器,其中'存在模态'选项。
另一个vc_studyDesc
有一个UIButton,它可能会返回到前一个控制器。为实现这一点,我使用了以下方法:
vc_signup
的标识符为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"}}
的{{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是由其标识符选择的。
我可以按照我想要的方式传递我想要的变量吗?添加标签将不胜感激!
答案 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?
}