为啥由 UITabBarController.viewDidLoad 中的代码添加的自定义按钮不响应选择器

Posted

技术标签:

【中文标题】为啥由 UITabBarController.viewDidLoad 中的代码添加的自定义按钮不响应选择器【英文标题】:why does a custom button which added by code in UITabBarController.viewDidLoad doesn't response the selector为什么由 UITabBarController.viewDidLoad 中的代码添加的自定义按钮不响应选择器 【发布时间】:2019-06-06 04:48:26 【问题描述】:

我在MyViewController.viewDidLoad(subclass of UITabBarController) 的 tabBar 中添加了一个自定义按钮

但我发现它没有响应选择器。

如果我延迟一秒钟添加按钮(in DispatchQueue.main.asyncAfter closure),它可以正常工作。

我认为这不是解决问题的正确方法。

func addButton() 
        let button = UIButton(type: UIButton.ButtonType.custom)
        button.bounds = CGRect(x:0,y:0,width:30,height:30);
        button.backgroundColor = UIColor.red
        button.center = CGPoint(x:self.tabBar.frame.size.width/2, y:self.tabBar.frame.size.height/2 - 20);
        button.addTarget(self, action: #selector(click(button:)), for: UIControl.Event.touchUpInside)
        tabBar.addSubview(button)
    

【问题讨论】:

你在哪里调用这个方法? override func viewDidLoad() 可以添加函数click(button:)的代码吗? 【参考方案1】:

您已将按钮添加到UITabBarControllerUITabBar,因为按帧,按钮的一半将显示在选项卡栏上方,另一半显示在选项卡栏下方。

所以我猜你不会点击那个按钮的一部分,它不在 Tabbar(Tabbar 上方)不会被触摸。我会让按钮变大或者尝试在模拟器中点击箭头,你会明白的。

如果您需要底部有按钮但略高,请创建自定义Tabbar来实现这样的设计。或者,您可以将该按钮添加到 UITabBarController 的视图中,而不是 Tabbar。

class MyTabBarController: UITabBarController 

    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.addButton()
    

    func addButton() 
        let button = UIButton(type: UIButton.ButtonType.custom)
        button.bounds = CGRect(x:0,y:0,width:50,height:50);  //1
        button.backgroundColor = UIColor.purple
         button.center = CGPoint(x:self.tabBar.frame.size.width/2, y:self.tabBar.frame.size.height/2 - 50 + self.tabBar.frame.origin.y);  //2
         button.addTarget(self, action: #selector(click(button:)), for: UIControl.Event.touchUpInside)

         button.layer.cornerRadius = button.frame.size.height/2
         button.layer.masksToBounds = false
         button.layer.shadowColor = UIColor.black.withAlphaComponent(0.5).cgColor
         button.layer.shadowRadius = 5.0
         button.layer.shadowOffset = CGSize(width: 0.0, height: 5.0)
         button.layer.shadowOpacity = 0.5

        //tabBar.addSubview(button)  //3
         self.view.addSubview(button). //4
    

    @objc func click(button: UIButton) 
         print("Button get clicked")
    

我在行尾用数字注释了四件事,您可以在代码中制作并尝试。

【讨论】:

以上是关于为啥由 UITabBarController.viewDidLoad 中的代码添加的自定义按钮不响应选择器的主要内容,如果未能解决你的问题,请参考以下文章

为啥所有标签_都是-1?由 DBSCAN 在 Python 中生成

为啥这个由 facebook 生成的深层链接(applink)不起作用?

为啥这个 PHP 脚本(由 AJAX 调用)随机无法正确加载 SESSION?

如果部分写入参与超时块,为啥由 document.write 创建的文档呈现方式不同?

为啥读取 localStorage 值需要刷新页面才能显示由 jQuery 切换的 CSS 更改?

为啥我收到错误:Unmatched ( in regex; 由 <-- HERE 标记?