[背景]
折腾:
期间,需要实现页面到跳转:
点击 注册协议 跳转到 我新写的:
RegistrationAgreementController
所以参考之前的已有代码,写了如下代码:
func registrationAgreementAction(button : UIButton){ print("registrationAgreementAction()") centerViewController.navigationController?.pushViewController(RegistrationAgreementController(), animated: true) }
但是页面并没有跳转到对应的RegistrationAgreementController里面的viewDidLoad:
import UIKit class RegistrationAgreementController : UIViewController { init() { super.init(nibName: nil, bundle: nil) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func viewDidLoad() { super.viewDidLoad()
[解决过程]
1.去改为:
self.navigationController?.pushViewController(RegistrationAgreementController(), animated: true)
或:
centerViewController.navigationController?.pushViewController(RegistrationAgreementController(), animated: false)
结果也还是没有跳转。
2.去掉那些init试试:
import UIKit class RegistrationAgreementController : UIViewController { // init() { // super.init(nibName: nil, bundle: nil) // } // // required init?(coder aDecoder: NSCoder) { // super.init(coder: aDecoder) // } override func viewDidLoad() { super.viewDidLoad()
结果:
还是不行。
3.搜:
swift navigationController pushViewController not switch ui
swift pushViewController not switch ui
swift UI not switch
swift pushViewController not work
参考:
4.参考:
去试试,重启Xcode。
结果问题依旧。
去用:NSLog打印navigationController 看看是否是nil:
NSLog("centerViewController.navigationController=\(centerViewController.navigationController)") NSLog("self.navigationController=\(self.navigationController)")
果然,self的是nil,不过另外那个不是nil:
2015-10-20 17:43:04.625 xxx[12863:1866954] centerViewController.navigationController=Optional(<UINavigationController: 0x7fd7ca079c00>) 2015-10-20 17:43:04.625 xxx[12863:1866954] self.navigationController=nil
所以改为:
centerViewController.navigationController?.pushViewController(RegistrationAgreementController(), animated: true)
5.搜:
swift navigationController not working
参考:
->
先去看看storyboard是否是nil:
NSLog("self.storyboard=\(self.storyboard)")
结果是nil:
self.storyboard=nil
6.后来调试期间,无意间发现:
点击了两次的回退:
后,然后才执行到了对应的代码:
网页内容是可以正常显示了:
但是需要接着解决,页面没有跳转的原因。
搜:
后来去看到:
之前的view的代码,好像不是调用的:pushViewController
而是presentViewController:
override func viewWillAppear(animated: Bool) { if isLogin == false { centerViewController.presentViewController(LoginViewController(), animated: true, completion: nil) } }
和
func registerAction(button : UIButton){ self.presentViewController(RegisterViewController(), animated: true, completion: nil) }
-》即,先后两层的view的调用,都是用的是:presentViewController
-》所以导致了,我最新的view,即使去调用了pushViewController,但是却被之前的两层的view,挡住了。
-》所以,看起来,去把前面两层的UI的view的跳转方式改为pushViewController
或者是:
最新的UI的view,也去改为:presentViewController
估计就可以正常显示了。
去试试后面的方式:
self.presentViewController(RegistrationAgreementController(), animated: true, completion: nil)
结果是:
就可以正常显示了:
点击:
注册协议
即可跳转到:新的注册协议的页面:
然后点击回退:
即可退回前面的一个页面。
[总结]
此处,父级页面,对应的页面跳转代码是:
let regProtolBtn = UIButton() regProtolBtn.frame = CGRectMake(210, self.view.bounds.height / 2 + 175, 60, 20) regProtolBtn.addTarget(self, action:Selector("registrationAgreementAction:"), forControlEvents:UIControlEvents.TouchUpInside) let regProtolLabel = UILabel() regProtolLabel.frame = CGRectMake(0, 0, 60, 20) regProtolLabel.text = "注册协议" regProtolLabel.textColor = UIColor(hexString: "#1970fe") regProtolLabel.textAlignment = NSTextAlignment.Left regProtolLabel.font = UIFont.boldSystemFontOfSize(13) regProtolBtn.addSubview(regProtolLabel) self.view.addSubview(regProtolBtn) func registrationAgreementAction(button : UIButton){ self.presentViewController(RegistrationAgreementController(), animated: true, completion: nil) }
对应的字页面的返回代码是:
let backImage = UIImage(named: "back.png") let backBtn = UIButton() backBtn.frame = CGRectMake(10, 30, 24, 24) backBtn.addTarget(self, action:Selector("close"), forControlEvents:UIControlEvents.TouchUpInside) backBtn.setImage(backImage, forState:UIControlState.Normal) backBtn.setImage(backImage, forState: UIControlState.Selected) self.view.addSubview(backBtn) func close() { self.dismissViewControllerAnimated(true, completion: { }) }
注意:
如果前面用的是pushViewController:
self.navigationController?.pushViewController(RegistrationAgreementController(), animated: true)
则子页面应该用:
func close(button : UIButton) { self.navigationController?.popViewControllerAnimated(true) }
这样才能正常的,push一个view,然后退出,返回页面时pop出对应的view。
[后记]
参考了:
把:
pushViewController:animated
改为:showViewController
let regAgreeVC = RegistrationAgreementController() self.showViewController(regAgreeVC as UIViewController, sender: regAgreeVC)
结果也是可以的,正常可以显示页面和切换页面,返回页面的。