【问题标题】:Why is the UITabBarControllerDelegate nil right after I set it?为什么 UITabBarControllerDelegate 在我设置后立即为零?
【发布时间】:2016-04-09 02:00:33
【问题描述】:

我有一个涉及UITabBarControllerDelegate 的奇怪问题。

我正在使用以下代码:

import UIKit

class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = MainTabBarControllerDelegate()
        print("did set delegate to \(self.delegate)")
    }

}

class MainTabBarControllerDelegate: NSObject, UITabBarControllerDelegate {

    func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
        print("selected: \(viewController) --> index: \(tabBarController.selectedIndex)")
    }

}

然后,在我的 Storyboard 中,我有一个香草 UITabBarController 和两个普通的 UIViewControllers 连接到它。我只是想捕捉标签更改事件,但由于某种原因,我的MainTabBarControllerdelegate 没有正确设置。

当我使用上面的代码运行项目时,控制台输出:

did set delegate to nil

它为什么不创建一个适当的MainTabBarControllerDelegate 实例以便可以调用它的委托方法?

【问题讨论】:

  • 委托属性通常很弱。您必须在其他地方强烈引用您的代表才能使其保持活力。
  • 啊,是的!愚蠢的错误,谢谢!!请将此添加为答案而不是评论,以便我可以接受它并且您得到应得的分数;)@AntonBronnikov
  • 完成。是 AFK(来自移动端),所以必须简洁。

标签: ios swift delegates uitabbarcontroller


【解决方案1】:

在这里self.delegate = MainTabBarControllerDelegate() 创建一个委托并立即将其分配给delegate 属性,即weak。因此,委托被创建但随后立即被释放,因为没有任何东西持有对它的强引用。

【讨论】:

  • 我很好奇你是怎么知道 MainTabBarControllerDelegate 有一个弱引用的。这是一个常见的约定还是您实际上检查了 MainTabBar 的声明...?
  • @DanBeaulieu,委托模式与其说是约定不如说是必要。很多时候,委托和委托人保持相互引用,其中一个引用必须是弱的,以避免引用循环。通常是委托具有弱引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多