使用自定义collectionView作为UITabBarController

时间:2017-02-15 12:06:11

标签: swift uiview swift3 uicollectionview uicollectionviewcell

我有一个名为Invalidate and Restart的自定义UIView。此菜单栏是一个自定义的“标签栏”,其中包含MenuBar个5个单元格。当点击一个单元格时,我想提出一个collectionView,但我不能在我的ViewController方法中调用类似下面的代码,因为我无法访问当前函数:

didSelect

有没有人有解决方案?任何帮助将受到高度赞赏。感谢你们。我的代码如下:

if indexPath.item == 1 {
    let dummyController = DummyController()
    present(dummyController, animated: true, completion: nil)
}

2 个答案:

答案 0 :(得分:0)

为自定义视图定义委托,当拥有此视图的视图控制器创建它时,它可以将自己设置为委托并处理演示文稿本身。

E.g。

protocol MenuBarDelegate: class {
  func didSelectItem(index: IndexPath, menuBar: MenuBar)
}

class MenuBar {
  weak var delegate: MenuBarDelegate?
}

然后在创建菜单栏的视图控制器中执行:

menuBar.delegate = self

实现didSelectItem方法并在那里处理它 - 你实际上是在自己的所有视图中使用自己版本的Apple无处不在的委托模式。您可能希望将所选项目建模为indexPath以外的其他项目,但我不知道您的代码。

我建议您始终从视图逻辑中解除模型逻辑。例如,视图应该永远不知道它正在显示的模型,并且在用户与之交互时不应该知道该做什么。这应始终解除耦合并转发。

答案 1 :(得分:0)

我同意@Jeff关于模型逻辑应始终从视图逻辑中解耦的观点。但是,我最近实现了自己的Tabbar,并按照以下方式实现:

  1. 我在AppDelegate中实例化UINavigationController,以便我可以从任何地方访问它。
  2. 然后在您的自定义MenuBar中,您可以通过调用(UIApplication.shared.delegate as AppDelegate).YOURNAVIGATIONCONTROLLER来访问此导航控制器,并使用它来呈现您想要呈现的视图控件。
  3. 如果您确实想将MenuBar用作UITabbarController,那么您应该始终将要呈现的viewcontroller设置为navigationcontroller的rootViewController,如下所示:

    var appDelegate = UIApplication.shared.delegate as? AppDelegate中 appDelegate?.YOURNAVIGATIONCONTROLLER?.viewControllers = [(DummyController())!]

  4. 希望这很有用!