web-dev-qa-db-ja.com

Swift:UITabBarItemが押されたときにアクションを実行する方法

現在、Tableview Controllerに接続されているTab Bar Controllerがあります。タブバー項目を押すと、tableviewの一番上に移動しようとしています。テーブルビューのトップに到達する方法を知っています。アイテムが押されたときにアクションを実行する方法がわかりません。

20
K Swisha

メソッドUITabBarDelegatedidSelectItemを使用する必要があります。標準のデリゲートとして使用します。

class yourclass: UIViewController, UITabBarDelegate {
    func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
        //This method will be called when user changes tab.
    }
}

また、View ControllerでTab Barデリゲートをselfに設定することを忘れないでください。

28
Nikita Zernov

この質問に対する答えはこちら

基本的にこれを行います:

  • View ControllerがUITabBarDelegateにサブスクライブされていることを確認してください
  • 各タブバー項目のIBでタグを設定します
  • 次のようなdidSelectItemメソッドを実装します。

    -(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
        if(item.tag == 1) {
           // Code for item 1
        }
        else if(item.tag == 2) {
           // Code for item 2
        }
    }
    

これにより、タップされた各タブ項目イベントにアクセスできます。それが役に立てば幸い!

Swiftの場合:

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    if(item.tag == 1) {
        // Code for item 1
    } else if(item.tag == 2) {
        // Code for item 2
    }
}
19
erparker

スイフト3

class yourclass: UIViewController, UITabBarDelegate {
    func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        print("Test")
    }
}

また、viewDidLoadでtabBarデリゲートをselfに設定することを忘れないでください

override func viewDidLoad(){
    super.viewDidLoad()
    <YOUR TAB BAR NAME>.delegate = self 
}
10
Ahmed Safadi

ここで他の答えを実装するのに問題がありました。これはより完全な答えです。 UITabBarController(新しいタブ付きアプリを作成する場合のデフォルト)を使用していることを前提としています。このソリューションは、View Controllerのタブボタンがタップされるたびにメッセージを印刷します。

enter image description here

コード

MyTabBarController.Swiftという名前の新しいSwiftファイルを作成します。次のコードを貼り付けます。

import UIKit

class MyTabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // tell our UITabBarController subclass to handle its own delegate methods
        self.delegate = self
    }

    // called whenever a tab button is tapped
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

        if viewController is FirstViewController {
            print("First tab")
        } else if viewController is SecondViewController {
            print("Second tab")
        }
    }
}

インターフェースビルダー

ストーリーボードで、Tab Bar Controllerを選択します。次に、IDインスペクターで、クラス名をMyTabBarController(つまり、上記のコードのクラスの名前)に設定します。

enter image description here

それで全部です。今すぐアプリを実行して、ユーザーがタブバー項目をタップするたびに通知を受けることができます。

ノート

  • タップでメソッドを実行する必要がある場合は、didSelectメソッドで次のようなことができます。

    if let firstVC = viewController as? FirstViewController {
        firstVC.doSomeAction()
    }
    
  • FirstViewControllerにデリゲートを実装させ、そこですべてを処理することもできます。そうすれば、カスタムUITabBarControllerサブクラスを作成してIBに設定する必要がなくなります。しかし、子供に親の仕事をさせるのは間違った場所のように思えます。とにかく、ここにあります:

    class FirstViewController: UIViewController, UITabBarControllerDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            tabBarController?.delegate = self
        }
    
        func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
            // ...
        }
    }
    

    上記のdidSelectメソッドは、どのタブがタップされても呼び出されます。

  • UITabBarControllerDelegate ドキュメント

7
Suragch

別の解決策は、タブに表示されているView ControllerでviewDidAppearで何かをすることです。

最初のタブビューコントローラー

import UIKit
class FirstViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("First tab")
    }
}

2番目のTab View Controller

import UIKit
class SecondViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("Second tab")
    }
}
4
Suragch