【问题标题】:Swift 4: Unable to push ViewController upon button click.Swift 4:无法在按钮单击时推动 ViewController。
【发布时间】:2018-11-28 19:27:30
【问题描述】:

我会尽力解释我的问题,所以提前谢谢。

我通常通过让每个 ViewController 代表不同的视图来构建具有多个视图控制器的应用程序。现在,我正在创建一个具有许多不同视图的大型应用程序。我不想在我的应用程序中有 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")
        }
    }
}

【问题讨论】:

  • 确保self.homeController 不为零。如果这不是问题,请确保 homeController 实际上在导航控制器中。
  • 当我添加断点时,Home 控制器确实出现了 nil。初始化家庭控制器的步骤是什么?

标签: ios swift uiview uinavigationcontroller viewcontroller


【解决方案1】:

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

如果你在有问题的行放置一个断点,它应该会给你更多关于它是否已经初始化的信息。

【讨论】:

  • 你在什么时候初始化 HomeController?我假设您已将断点放置在此处?: self.homeController?.displayController(menuOption: option, view: ProfileView(frame: UIScreen.main.bounds)) 在这种情况下,主控制器属性是可选的.当可选属性为 nil 时,后面的任何语句都不会执行,否则会导致崩溃。
  • 我将 homeController 设置为 var homeController: HomeController?。如果我将它初始化为 let homeController = HomeController() 它将在启动时导致崩溃。
  • 我尝试在 HomeController 的函数中添加 menuLauncher.homeController = self,但没有成功。
  • 我假设 MenuLauncher 是包含集合视图代码的视图控制器?您可以在执行呼叫之前分配和创建家庭控制器吗? self.homeController = HomeController() self.homeController?.displayController(menuOption: option, view: ProfileView(frame: UIScreen.main.bounds)) 我也有点困惑,因为(根据我的理解)您实际上是在创建家庭控制器只是为了呈现 SelectionController?
  • 对。所以我有一个显示 homeView 的家庭控制器。但我有一个滑出菜单,其中包含一个可供选择的 collectionView。一旦选择了索引,menuLauncher 就会从 homeController 调用该函数。
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多