Ios Swift 4:单击按钮时无法按ViewController。

Ios Swift 4:单击按钮时无法按ViewController。,ios,swift,uiview,uinavigationcontroller,viewcontroller,Ios,Swift,Uiview,Uinavigationcontroller,Viewcontroller,我会尽我所能解释我的问题,所以提前谢谢你 我通常通过让每个视图控制器代表不同的视图来构建具有多个视图控制器的应用程序。现在,我正在创建一个具有许多不同视图的大型应用程序。我不希望我的应用程序中有15个以上的ViewController。我希望一个ViewController继承不同的UIView 例如,如果在我的菜单栏上选择“配置文件”选项。然后,我将被带到selectionController,并让selectionController继承名为Settings View的UIView 出于某种

我会尽我所能解释我的问题,所以提前谢谢你

我通常通过让每个视图控制器代表不同的视图来构建具有多个视图控制器的应用程序。现在,我正在创建一个具有许多不同视图的大型应用程序。我不希望我的应用程序中有15个以上的ViewController。我希望一个ViewController继承不同的UIView

例如,如果在我的菜单栏上选择“配置文件”选项。然后,我将被带到selectionController,并让selectionController继承名为Settings View的UIView

出于某种原因,在调用函数以显示profileView时,不会发生任何事情。我以前也实现过类似的功能,但它不起作用

HomeController

//This function is called upon menu tap

func displayController(menuOption: MenuOption, view: UIView) {
    let selectionController = UIViewController()
    selectionController.view.frame = UIScreen.main.bounds
    selectionController.navigationItem.title = menuOption.name
    selectionController.view.backgroundColor = Color.defaultBackgrondColor

    selectionController.view.addSubview(view)

    navigationController?.navigationBar.tintColor = UIColor.white
    navigationController?.pushViewController(selectionController, animated: true)
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

//CARRY OUT ANIMATION FOR MENU BAR...

    }) { (completed: Bool) in
        let option = self.menuOptions[indexPath.row]

        switch option.name {
        case "Profile":

//This is where I call my function to display the new view

            self.homeController?.displayController(menuOption: option, view: ProfileView(frame: UIScreen.main.bounds))
        default:
            print("Staying on home page")
        }
    }
}
菜单栏

//This function is called upon menu tap

func displayController(menuOption: MenuOption, view: UIView) {
    let selectionController = UIViewController()
    selectionController.view.frame = UIScreen.main.bounds
    selectionController.navigationItem.title = menuOption.name
    selectionController.view.backgroundColor = Color.defaultBackgrondColor

    selectionController.view.addSubview(view)

    navigationController?.navigationBar.tintColor = UIColor.white
    navigationController?.pushViewController(selectionController, animated: true)
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

//CARRY OUT ANIMATION FOR MENU BAR...

    }) { (completed: Bool) in
        let option = self.menuOptions[indexPath.row]

        switch option.name {
        case "Profile":

//This is where I call my function to display the new view

            self.homeController?.displayController(menuOption: option, view: ProfileView(frame: UIScreen.main.bounds))
        default:
            print("Staying on home page")
        }
    }
}

您是否已确保导航控制器已初始化?您是使用故事板还是以编程方式设置家庭控制器


如果在有问题的行上放置断点,它将提供有关断点是否已初始化的更多信息。

确保
self.homeController
不是零。如果这不是问题所在,请确保
homeController
实际上位于导航控制器中。当我添加断点时,Home controller显示为零。初始化家庭控制器的步骤是什么?在什么时候初始化家庭控制器?我假设您已将断点放在这一行?:self.homeController?.displayController(menuOption:option,view:ProfileView(frame:UIScreen.main.bounds))在这种情况下,主控制器属性是可选的。当可选属性为nil时,后面的任何语句都不会执行,否则会导致崩溃?。如果我将其初始化为let homeController=homeController(),它将在启动时导致崩溃。我尝试在homeController的函数中添加menuLauncher.homeController=self,但没有成功。我假设menuLauncher是包含集合视图代码的视图控制器?在您这样对主控制器执行调用之前,您能分配并创建主控制器吗
self.homeController=homeController()self.homeController?.displayController(菜单选项:option,视图:ProfileView(frame:UIScreen.main.bounds))
我也有点困惑,因为(据我所知)您创建homeController基本上只是为了显示SelectionController?对。因此,我有一个显示homeView的主控制器。但我有一个滑出式菜单,它有一个collectionView,可以从中选择选项。选择索引后,menuLauncher将从homeController调用该函数。