为 UITabBarItem 设置操作

Posted

技术标签:

【中文标题】为 UITabBarItem 设置操作【英文标题】:Set Action for 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 我非常感谢您的帮助 【参考方案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 :( 我正在尝试通过您的在线答案和视频来学习。感谢您的翻译,我现在就试试

以上是关于为 UITabBarItem 设置操作的主要内容,如果未能解决你的问题,请参考以下文章

设置 UITabBarItem 徽章

如何在 UITabBarItem 上设置不同的未选择图像和文本颜色

如何使 UITabBarItem 忽略 tintColor

BadgeValue 未在 UITabBarItem 上更新

UITabBarItem 的标签

UITabbarItem BadgeValue 文本颜色