現在、Tableview Controllerに接続されているTab Bar Controllerがあります。タブバー項目を押すと、tableviewの一番上に移動しようとしています。テーブルビューのトップに到達する方法を知っています。アイテムが押されたときにアクションを実行する方法がわかりません。
メソッドUITabBarDelegate
でdidSelectItem
を使用する必要があります。標準のデリゲートとして使用します。
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
に設定することを忘れないでください。
基本的にこれを行います:
次のような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
}
}
スイフト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
}
ここで他の答えを実装するのに問題がありました。これはより完全な答えです。 UITabBarController
(新しいタブ付きアプリを作成する場合のデフォルト)を使用していることを前提としています。このソリューションは、View Controllerのタブボタンがタップされるたびにメッセージを印刷します。
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
(つまり、上記のコードのクラスの名前)に設定します。
それで全部です。今すぐアプリを実行して、ユーザーがタブバー項目をタップするたびに通知を受けることができます。
タップでメソッドを実行する必要がある場合は、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
ドキュメント
別の解決策は、タブに表示されている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")
}
}