Swift登录后HomeViewController的CollectionView与侧边栏无响应求助
看起来你踩了一个视图控制器层级结构的常见坑!让我帮你分析下问题根源,再给出具体的解决步骤:
当你把MyNavigationController设为初始视图控制器时,HomeViewController是被包裹在这个集成了ENSideMenu的导航控制器里的——这时候侧边栏的toggleSideMenuView()方法能找到对应的容器,collectionView跳转依赖的navigationController也存在,所以一切正常。
但从登录页面直接把HomeViewController设为rootViewController时,HomeVC完全脱离了原来的层级:它既没有被放入ENSideMenu需要的导航容器中,也没有可用的导航控制器来支持push跳转,自然就出现了点击无响应的情况。
1. 先确认Storyboard结构
确保MyNavigationController的根视图控制器已经设置为HomeViewController(在Storyboard里选中导航控制器,在Attributes Inspector里关联好Root View Controller),并且给MyNavigationController设置了正确的Storyboard ID(比如MyNavigationController)。
2. 修改登录成功后的跳转代码
在SignInViewController的logInService方法里,把原来直接设置HomeVC为root的代码替换掉:
原来的错误代码:
let homeVC = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController let appDelagate = UIApplication.shared.delegate appDelagate?.window??.rootViewController = homeVC
修改后的代码:
// 实例化集成了ENSideMenu的导航控制器(它的根VC已经是HomeVC) let navVC = self.storyboard?.instantiateViewController(withIdentifier: "MyNavigationController") as! MyNavigationController let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = navVC
3. 同步修正AppDelegate中的代码
同样,在AppDelegate的didFinishLaunchingWithOptions方法里,也要改为设置导航控制器为root,而不是直接设置HomeVC:
原来的错误代码:
let homeVC = mainStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController self.window!.rootViewController = homeVC
修改后的代码:
let navVC = mainStoryBoard.instantiateViewController(withIdentifier: "MyNavigationController") as! MyNavigationController self.window!.rootViewController = navVC
额外验证点
- 确认
MyNavigationController是继承自ENSideMenuNavigationController(或者你项目中集成ENSideMenu的导航控制器类),这样toggleSideMenuView()方法才能被正确调用。 - 检查
HomeViewController中collectionView的didSelectItemAt方法,现在self.navigationController会指向MyNavigationController,push跳转就能正常工作了。
这样修改后,HomeViewController就回到了正确的层级结构中,侧边栏和collectionView的点击事件都会恢复正常。
内容的提问来源于stack exchange,提问作者Swift

