我有2个视图控制器
1. ViewController(VC)
2. WebViewController(WVC)
在VC中,我点击一个按钮,显示WVC。 在WVC中成功完成所有任务后,我想显示VC并在VC中执行特定功能。
现在,Storyboard包含一些对象,并使用单击和拖动添加到VC。
最初,它有一些值(不是零)。
我点击按钮,WVC被推,完成WVC中的所有任务后,
VC被推了。
现在VC中的一些值是零。
错误,欢迎(UILabel
,UIView
)是零...
而且还想在VC中调用一个函数。
怎么可能。?
class LoginController:UIViewController,UITextFieldDelegate{
@IBOutlet weak var password: UITextField!
@IBOutlet weak var username: UITextField!
@IBOutlet weak var error: UILabel!
@IBOutlet weak var welocome: UILabel!
......
@IBAction func BtnClicked(sender: AnyObject) {
let webViewCnt = self.storyboard!.instantiateViewControllerWithIdentifier("WebViewController") as UIViewController
self.navigationController?.pushViewController(webViewCnt, animated: true)
}
func doSomeProcess(){
}
}
class WebViewController: UIViewController, UITextFieldDelegate,UIWebViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
webView.delegate = self
self.start()
}
func start(){
---- do some process ----
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let ViewCont = self.storyboard!.instantiateViewControllerWithIdentifier("LoginController") as UIViewController
self.navigationController?.pushViewController(ViewCont, animated: true)
ViewController().doSomeProcess() // call viewcontroller doSomeProcess() function
}
})
}
}
答案 0 :(得分:1)
尝试弹出:
在这个start()方法中只需替换一行self.navigationController?.popViewController(animated: true)
而不是推动ViewController。
func start(){
---- do some process ----
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let ViewCont = self.storyboard!.instantiateViewControllerWithIdentifier("LoginController") as UIViewController
self.navigationController?.pushViewController(ViewCont, animated: true)
ViewController().doSomeProcess() // call viewcontroller doSomeProcess() function
}
})
}
<强>原因:强>
当您推送到任何ViewController时,故事板将创建ViewController的新引用,并且OOP说每个对象都有自己的属性和方法,这就是为什么推送视图控制器属性可能是nil
假设由于ViewController的单独实例,您的username: UITextField!
文本将为零。
要调用视图控制器的功能,您必须实现delegate,如果不是viewwillappear
的每个其他时间都不能实现。{/ p>
答案 1 :(得分:1)
简单你正在推动VC到WVC, 在将WVC推送到NavigationController后,逻辑上如此。 它将WVC添加到导航堆栈的顶部。 &安培;从导航中弹出此WVC会更好地自动显示具有先前值的VC。
使用此
class LoginController:UIViewController,UITextFieldDelegate{
@IBOutlet weak var password: UITextField!
@IBOutlet weak var username: UITextField!
@IBOutlet weak var error: UILabel!
@IBOutlet weak var welocome: UILabel!
var isBackFromWVC = false
......
@IBAction func BtnClicked(sender: AnyObject) {
let webViewCnt = self.storyboard!.instantiateViewControllerWithIdentifier("WebViewController") as UIViewController
self.navigationController?.pushViewController(webViewCnt, animated: true)
isBackFromWVC = true
}
func doSomeProcess(){
}
func vieWillAppear(){
if(isBackFromWVC){
doSomeProcess()
}
}
}
class WebViewController: UIViewController, UITextFieldDelegate,UIWebViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
webView.delegate = self
self.start()
}
func start(){
---- do some process ----
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.navigationController?.popViewController(animated:true)
}
})
}
}
答案 2 :(得分:0)
根据我的理解,您可能想要解雇WVC
并返回VC
。
WebViewController
的{{1}}:中
start()
并且在pop之后,您需要执行self.navigationController?.popViewController(animated: true)
功能。有几种方法可以做到这一点,我将在这里介绍一个。
doSomeProcess()
中,实施ViewController
:
UINavigationControllerDelegate
当然你需要
func navigationController(_ navigationController: UINavigationController, animationCOntrollerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewCOntroller) -> UIViewControllerAnimatedTransitioning? {
switch operation {
case .pop:
let to = toVC as! ViewController
to.doSomeProcess()
default:
break
}
return nil
}
在self.navigationController?.delegate = self
的{{1}}内。