![](/img/trans.png)
[英]How can I push the next view controller on a navigation controller programmatically?
[英]How can I pass data to the next view controller when it is loaded programmatically?
假设我在Main.storyboard中有三个视图控制器。 这三个中的两个vc_login
和vc_studyDesc
使用带有'present modally'选项的UIButton加载另一个视图控制器。
另一个vc_signup
具有UIButton,该UIButton可以返回到先前的控制器。 为此,我使用了以下方法:
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_studyDesc
调用vc_signup
时,应用程序终止。 我发现这是因为我错过了必须在vc_signup
加载的重要变量。
vc_studyDesc
有一些要从Firebase引用的数据。 我是通过从先前的vc加载一个变量postID
到vc_studyDesc
来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)
或者如果您在导航控制器中具有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.