我有一个包含五个项目的标签栏,我试图添加一个功能,当用户再次点击标签栏项目时滚动到顶部。将UITabBarControllerDelegate
添加到我想要触发事件的视图中,还创建了一个函数来确定所选的标签栏索引。
当我打开应用程序时,索引0会自动选择并完美运行。当我向下滚动并点击标签栏索引时,视图自动滚动到顶部。当我转到索引1并在那里触发滚动时,会出现问题。它以某种方式完全从我的第一个标签栏项目中删除了自动滚动。
选择不使用自动滚动的其他标签栏项目根本不会影响索引0.
主页(索引0)
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
let tabBarIndex = tabBarController.selectedIndex
if tabBarIndex == 0 {
self.collectionView?.setContentOffset(CGPoint(x: 0, y: -10), animated: true)
}
}
用户(索引1)
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
let tabBarIndex = tabBarController.selectedIndex
if tabBarIndex == 1 {
self.tableView?.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
}
}
答案 0 :(得分:1)
任何具有delegate
属性的内容在任何给定时间只能为其分配一个代理。最近设置delegate
的内容将接收下一个委托方法调用。
在您的情况下,您可以在每个视图控制器的delegate
方法中将选项卡控制器的self
重置为viewDidAppear
,因为您希望当前可见的视图控制器成为当前选项卡控制器委托。
将以下内容添加到需要作为选项卡控制器委托的每个视图控制器:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.tabBarController?.delegate = self
}