Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从未调用UITabBarControllerDelegate的shouldSelect方法_Ios_Swift_Uitabbarcontroller - Fatal编程技术网

Ios 从未调用UITabBarControllerDelegate的shouldSelect方法

Ios 从未调用UITabBarControllerDelegate的shouldSelect方法,ios,swift,uitabbarcontroller,Ios,Swift,Uitabbarcontroller,我使用的是Swift 4和XCode 9。我正试图以编程方式控制UITabBarController中的导航。根据,我需要实现UITabBarControllerDelegate协议。但是,我实现的方法从未被调用: import UIKit class TabBarController: UITabBarController, UITabBarControllerDelegate { override func viewDidLoad() { super.viewDid

我使用的是Swift 4和XCode 9。我正试图以编程方式控制UITabBarController中的导航。根据,我需要实现
UITabBarControllerDelegate
协议。但是,我实现的方法从未被调用:

import UIKit

class TabBarController: UITabBarController, UITabBarControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()

        tabBarController?.delegate = self
    }

    func tabBarController(_ tabBarController: UITabBarController,
            shouldSelect viewController: UIViewController) -> Bool {
        print("Should go here...")
        return true
    }
}

知道我做错了什么吗?

您的问题是设置了错误的代理。将
viewDidLoad
更新为:

override func viewDidLoad() {
    super.viewDidLoad()

    self.delegate = self // or just "delegate = self"
}

您希望此选项卡控制器成为自己的代理。

您的问题是设置了错误的代理。将
viewDidLoad
更新为:

override func viewDidLoad() {
    super.viewDidLoad()

    self.delegate = self // or just "delegate = self"
}

其想法是希望此选项卡控制器成为其自己的代理。

要检测所选项目事件,必须覆盖didSelect方法

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    print("Should go here...")
}

要检测所选项目事件,必须覆盖didSelect方法

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    print("Should go here...")
}


正确的实现方法是DidSelect…

正确的实现方法是DidSelect…

我怀疑有一些印刷错误,使您的方法与它要重写的委托方法不匹配,但我找不到difference@Alexander委托中的所有方法都是可选的,因此不需要
覆盖
关键字。问题回答正确,我没有正确初始化控制器。我怀疑有一些印刷错误,使您的方法与它要重写的委托方法不匹配,但我找不到difference@Alexander委托中的所有方法都是可选的,因此不需要
override
关键字。问题回答正确,我没有正确初始化控制器。为什么要这么麻烦呢。据我所知,他只需将UITabBarControllerDelegate从declaration@LeoDabus如果他希望选项卡控制器指示是否可以选择给定的选项卡,则不会执行此操作。
UITabBarController
没有实现
UITabBarControllerDelegate
@anderamugnani刚刚看到它符合
uitabbarelegate
not
UITabBarControllerDelegate
UIViewController
为方便起见提供了
tabBarController
属性,以便嵌入在选项卡栏控制器中的任何视图控制器都可以访问其父选项卡栏控制器。由于
uitabarcontroller
扩展
UIViewController
也具有此属性。事实上,如果在另一个选项卡控制器中嵌入选项卡控制器,则子选项卡控制器可以使用其
tabBarController
属性来获取父选项卡控制器。在您的情况下,您正在子类化
uitabarcontroller
,并且您希望访问
self
,而不是任何父选项卡控制器。为什么要这么麻烦呢。据我所知,他只需将UITabBarControllerDelegate从declaration@LeoDabus如果他希望选项卡控制器指示是否可以选择给定的选项卡,则不会执行此操作。
UITabBarController
没有实现
UITabBarControllerDelegate
@anderamugnani刚刚看到它符合
uitabbarelegate
not
UITabBarControllerDelegate
UIViewController
为方便起见提供了
tabBarController
属性,以便嵌入在选项卡栏控制器中的任何视图控制器都可以访问其父选项卡栏控制器。由于
uitabarcontroller
扩展
UIViewController
也具有此属性。事实上,如果在另一个选项卡控制器中嵌入选项卡控制器,则子选项卡控制器可以使用其
tabBarController
属性来获取父选项卡控制器。在您的情况下,您正在子类化
uitabarcontroller
,并且您希望访问
self
,而不是任何父选项卡控制器。这在显示新的UIView后调用。OP希望调用shouldSelect方法,以便他可以在显示新UIView之前执行某些操作。这是在显示新UIView之后调用的。OP希望调用shouldSelect方法,以便在显示新UIView之前可以执行某些操作。解释为什么它是“正确的方法”。解释为什么它是“正确的方法”。