Swift4中使用SideMenu库代码跳转ViewController时,导航保留及IBOutlet为空问题
嘿,我来帮你搞定这个问题!你遇到的IBOutlet全是nil、ViewController没加载的情况,核心原因是你没有正确从Storyboard/XIB中实例化ViewController,直接用MyViewController()或者错误的MyViewController.self()初始化,并不会加载对应的界面布局,自然连不上IBOutlet。结合SideMenu库的导航结构,给你一步步的解决方案:
第一步:修正ViewController的实例化方式
如果你的MyViewController是在Storyboard里创建的,绝对不能直接用默认初始化方法,必须从Storyboard中实例化:
// 替换成你的Storyboard名称(比如"Main")和ViewController的标识符 let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let targetVC = storyboard.instantiateViewController(withIdentifier: "MyViewController") as? MyViewController else { fatalError("无法从Storyboard实例化MyViewController,请检查标识符是否正确") }
注意:要先在Storyboard里给
MyViewController设置正确的Storyboard ID(在Identity Inspector面板里),否则会实例化失败。
第二步:结合SideMenu导航结构展示ViewController
因为你用了SideMenu库,主内容区域的导航是由SideMenu的导航控制器管理的,要保留SideMenu的导航功能,你需要向主内容的导航栈中push新VC:
情况1:在主内容的ViewController中操作
如果你的代码是写在主界面的ViewController里,直接用当前的导航控制器push即可:
self.navigationController?.pushViewController(targetVC, animated: true)
前提是你的主ViewController已经被包裹在
UINavigationController里,并且这个导航控制器是SideMenu的contentViewController(这是SideMenu的标准配置方式)。
情况2:从其他地方(比如SideMenu菜单中)操作
如果是从侧边栏菜单里跳转到新VC,需要先获取SideMenu管理的主内容导航控制器:
// 获取左侧菜单对应的主内容导航控制器(如果是右侧菜单就用menuRightNavigationController) if let mainNav = SideMenuManager.default.menuLeftNavigationController?.contentViewController as? UINavigationController { mainNav.pushViewController(targetVC, animated: true) }
为什么之前的代码会失败?
let vc = MyViewController.self()是语法错误,正确的默认初始化是MyViewController(),但这种方式不会加载Storyboard中的布局,所以ViewController的view没有被初始化,IBOutlet自然全是nil。- 用
pushViewController时,同样因为VC实例化错误,导致view未加载,出现相同问题。
只要按照上面的步骤先正确实例化VC,再结合SideMenu的导航结构push,就能解决问题,同时保留SideMenu的导航功能啦!
内容的提问来源于stack exchange,提问作者Benjamin RD

