我有一个名为Invalidate and Restart
的自定义UIView
。此菜单栏是一个自定义的“标签栏”,其中包含MenuBar
个5个单元格。当点击一个单元格时,我想提出一个collectionView
,但我不能在我的ViewController
方法中调用类似下面的代码,因为我无法访问当前函数:
didSelect
有没有人有解决方案?任何帮助将受到高度赞赏。感谢你们。我的代码如下:
if indexPath.item == 1 {
let dummyController = DummyController()
present(dummyController, animated: true, completion: nil)
}
答案 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,并按照以下方式实现:
UINavigationController
,以便我可以从任何地方访问它。MenuBar
中,您可以通过调用(UIApplication.shared.delegate as AppDelegate).YOURNAVIGATIONCONTROLLER
来访问此导航控制器,并使用它来呈现您想要呈现的视图控件。如果您确实想将MenuBar
用作UITabbarController
,那么您应该始终将要呈现的viewcontroller设置为navigationcontroller的rootViewController,如下所示:
var appDelegate = UIApplication.shared.delegate as? AppDelegate中 appDelegate?.YOURNAVIGATIONCONTROLLER?.viewControllers = [(DummyController())!]
希望这很有用!