【问题标题】:Set Action for UITabBarItem为 UITabBarItem 设置操作
【发布时间】:2017-03-08 20:11:03
【问题描述】:

如何为我的UITabBarItem 设置action?我可以以某种方式将它从storyboard 连接到代码吗?还是以编程方式?如果是这样,怎么办?

我的层次结构是UITabBarController -> UINavigationController -> UITabBarItem

很抱歉这个问题很愚蠢,但我真的需要一个答案。我在网上找不到任何关于此的信息。

使用 Swift 3 和 Xcode 8

谢谢!

我厌倦了 Mannopson 的回答(没用):

class BarsViewController: UITableViewController,UISearchResultsUpdating,UISearchBarDelegate,UISearchDisplayDelegate,UITabBarControllerDelegate{

override func viewDidLoad() {
super.viewDidLoad()


self.tabBarController?.delegate = self

        }

func tabBarController(tabBarController: UITabBarController, didSelect viewController: UIViewController) {
            if viewController.tabBarItem.tag == 1 {
                self.tableView.setContentOffset(.zero, animated: true)
            }
        }
        }
                extension UITableView {
                func scrollToTop(animated: Bool) {
                    setContentOffset(CGPoint.zero, animated: animated)
                }
            }

silentBob 回答对我不起作用:

class BarsViewController: UITableViewController,UISearchResultsUpdating,UISearchBarDelegate,UISearchDisplayDelegate,UITabBarControllerDelegate{


    override func viewDidLoad() {
        super.viewDidLoad()


    self.tabBarController?.delegate = self
}

func tabBarController(tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController.tabBarItem.tag == 1 {
            tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
        }
    }

}

我也尝试了 Tushar Sharma 的回答,但效果不佳。

我想要做的是,当您在tableView 中向下滚动时,您将点击当前的Tabbaritem,tableView 将像 intagram 一样滚动到顶部。

【问题讨论】:

  • 你的意思是 UITabBarItem 吗?
  • 是的!对不起,我会解决这个问题。
  • 使用一个标签,然后就可以检测当前选中的是哪个标签栏项
  • 可以帮我写代码吗?我不知道我该怎么做...
  • @Mannopson 我非常感谢您的帮助

标签: ios swift xcode uitabbar uitabbaritem


【解决方案1】:

基本上你会这样做:

1) 确保您的班级向 UITabBarDelegate 确认

2) 为每个标签栏项目在 IB 中设置标签

3) 实现 didSelectItem 方法,如下所示:

 class yourclass: UIViewController, UITabBarDelegate {
        func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
           if(item.tag == 1) {
       //your code for tab item 1
    }
    else if(item.tag == 2) {
       //your code for tab item 2
    }
        }
    }

【讨论】:

  • 感谢您的帮助!我将在几个小时内对其进行测试并报告:)
  • @Newbie Questions 没问题一定要在 IB 中提供标签,否则如果您尝试直接访问标签,它将崩溃。
  • @Newbie Questions 你在storyboard中指定了标签吗?
  • 是的,我给每个 tabbarbuttonitem 一个从 1 到 4 的特定选项卡
  • 我不知道,目前无法查看。几个小时后我也许可以。 @TusharSharma 知道为什么它不起作用吗?
【解决方案2】:

我认为您需要设置UITabBarControllerDelegate 协议。试试这个:

class YourClass: YourSuperClass, UITabBarControllerDelegate {

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController.tabBarItem.tag == 1 {
            self.tableView.setContentOffset(.zero, animated: true)
    }
}

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tabBarController?.delegate = self
    }
}

【讨论】:

  • 感谢您的帮助!我一回到家就试试这个
  • 我在我的 tableViewController 代码文件中实现了这个。
  • 您是否在 viewDidLoad 中将委托设置为 self?
  • 是的。委托设置为 self
  • 你不需要任何其他滚动功能
【解决方案3】:

如果您只想滚动到顶部,有一个内置的系统选项,请尝试点击状态栏。

编辑:

斯威夫特 3:

class ViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewWillAppear(_ animated: Bool) {
        self.tabBarController?.delegate = self
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

extension UITableViewController : UITabBarControllerDelegate {
    public func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
    }

}

斯威夫特 2:

tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)


extension UITableViewController : UITabBarControllerDelegate {
    func tabBarController(tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
    }
}

哦,那是一顿美味的午餐:)

这是一个 UITableViewController 的扩展,如果你想在每个视图控制器上滚动到顶部,你可以使用它,我还在玩它,但我认为你可以使用它。

【讨论】:

  • 是的,我知道,但是 instagram 有两种方法可以点击状态栏和 tabbaritem....我也想要它。
  • 在这里,我已经编辑了我的答案,我认为这应该适合你。您还可以选择使用属性而不是标签来在标签栏中获取正确的项目。 scrollRectToVisible 也是一个选项。
  • 你能翻译成 swift 2.2 吗?我很难翻译那个。会很有帮助,谢谢
  • 当然可以,但如果可以的话,我建议您切换到 Swift 3。它不会倒退,而且 Swift 4 已经在进行中。我认为语法是这样的:scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
  • 我知道......遗憾的是我几乎不知道 swift 2.2,这就是我开始使用的,我最喜欢这种语法......我需要很多帮助才能将我的项目转移到Swift 4 :( 我正在尝试通过您的在线答案和视频来学习。感谢您的翻译,我现在就试试
最近更新 更多