【问题标题】:Swift - Selected tab bar index not triggering scroll to topSwift - 选定的标签栏索引不会触发滚动到顶部
【发布时间】:2019-12-25 20:20:49
【问题描述】:

我有一个包含五个项目的标签栏,我正在尝试添加一个功能,以便在用户再次点击标签栏项目时滚动到顶部。将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)
    }
}

【问题讨论】:

  • 一个UITabBarController 只能有一个代表。最后一个获胜。
  • 真的!那么,如何将自动滚动添加到两个不同的标签栏项目呢?

标签: swift uitabbarcontroller


【解决方案1】:

具有delegate 属性的任何事物在任何给定时间都只能分配一个委托。最近设置过delegate 的对象将收到下一个委托方法调用。

在您的情况下,您可以在每个视图控制器的 viewDidAppear 方法中将标签控制器的 delegate 重置为 self,因为您希望当前可见的视图控制器成为当前的标签控制器委托。

将以下内容添加到需要成为选项卡控制器委托的每个视图控制器中:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.tabBarController?.delegate = self
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 2012-06-06
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多