Ios 嵌套UIView中的Swift按钮不可单击

Ios 嵌套UIView中的Swift按钮不可单击,ios,swift,uikit,Ios,Swift,Uikit,我有一个ViewController和另一个UIView名为MySubview,其中包含一个简单的按钮 如果我将MySubview添加到ViewController中,则按钮不可点击。但是,如果我将按钮直接放在ViewController中,一切都会正常工作 例如: class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad()

我有一个
ViewController
和另一个
UIView
名为
MySubview
,其中包含一个简单的按钮

如果我将
MySubview
添加到
ViewController
中,则按钮不可点击。但是,如果我将按钮直接放在
ViewController
中,一切都会正常工作

例如:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = MySubview()
        view.addSubview(button)
        
        button.translatesAutoresizingMaskIntoConstraints = false
        button.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
        button.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
    }
}

class MySubview: UIView {
    
    let button: UIButton = {
        let button = UIButton()
        button.setTitle("MyButton", for: .normal)
        button.setTitleColor(.label, for: .normal)
        button.addTarget(self, action: #selector(myfunc), for: .touchUpInside)
        return button
    }()
    
    @objc func myfunc() {
        print("clicked")
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        backgroundColor = .red
        addSubview(button)
        
        button.translatesAutoresizingMaskIntoConstraints = false
        
        button.topAnchor.constraint(equalTo: topAnchor, constant: 0).isActive = true
        button.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0).isActive = true
        
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

单击按钮时,我看不到打印的消息。

如果子视图的帧大小为零,则即使可以看到,也无法单击按钮。使用Xcode中的视图调试器将显示这是否是问题所在


另外,在添加子视图时,请检查该子视图是否启用了用户交互。

我认为,问题在于层(我的意思是子视图)。尝试此操作,而不是查看。添加子视图(按钮):


您的代码很混乱,如果我理解得很好,请查看下面的代码,在控制器类下声明您的按钮和视图:

class ViewController: UIViewController {

let button: UIButton = {
    let button = UIButton()
    button.setTitle("MyButton", for: .normal)
    button.setTitleColor(.white, for: .normal)
    button.backgroundColor = .black
    button.addTarget(self, action: #selector(myfunc), for: .touchUpInside)
    return button
}()

let mysubview = UIView()
...
现在在viewDidLoad中设置如下约束:

override func viewDidLoad() {
    super.viewDidLoad()
    
    mysubview.backgroundColor = .red
    
    view.addSubview(mysubview)
    mysubview.translatesAutoresizingMaskIntoConstraints = false
    mysubview.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
    mysubview.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
    mysubview.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
    mysubview.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true
    
    mysubview.addSubview(button)
    
    button.translatesAutoresizingMaskIntoConstraints = false
    button.topAnchor.constraint(equalTo: mysubview.topAnchor, constant: 20).isActive = true
    button.leadingAnchor.constraint(equalTo: mysubview.leadingAnchor, constant: 20).isActive = true
    button.trailingAnchor.constraint(equalTo: mysubview.trailingAnchor, constant: -20).isActive = true
    button.heightAnchor.constraint(equalToConstant: 50).isActive = true
}
现在添加你的函数

@objc func myfunc() {
    print("clicked")
}
完整代码:

import UIKit

class ViewController: UIViewController {

let button: UIButton = {
    let button = UIButton()
    button.setTitle("MyButton", for: .normal)
    button.setTitleColor(.white, for: .normal)
    button.backgroundColor = .black
    button.addTarget(self, action: #selector(myfunc), for: .touchUpInside)
    return button
}()

let mysubview = UIView()

override func viewDidLoad() {
    super.viewDidLoad()
    
    mysubview.backgroundColor = .red
    
    view.addSubview(mysubview)
    mysubview.translatesAutoresizingMaskIntoConstraints = false
    mysubview.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
    mysubview.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
    mysubview.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
    mysubview.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true
    
    mysubview.addSubview(button)
    
    button.translatesAutoresizingMaskIntoConstraints = false
    button.topAnchor.constraint(equalTo: mysubview.topAnchor, constant: 20).isActive = true
    button.leadingAnchor.constraint(equalTo: mysubview.leadingAnchor, constant: 20).isActive = true
    button.trailingAnchor.constraint(equalTo: mysubview.trailingAnchor, constant: -20).isActive = true
    button.heightAnchor.constraint(equalToConstant: 50).isActive = true
}

 @objc func myfunc() {
    print("clicked")
 }
}
import UIKit

class ViewController: UIViewController {

let button: UIButton = {
    let button = UIButton()
    button.setTitle("MyButton", for: .normal)
    button.setTitleColor(.white, for: .normal)
    button.backgroundColor = .black
    button.addTarget(self, action: #selector(myfunc), for: .touchUpInside)
    return button
}()

let mysubview = UIView()

override func viewDidLoad() {
    super.viewDidLoad()
    
    mysubview.backgroundColor = .red
    
    view.addSubview(mysubview)
    mysubview.translatesAutoresizingMaskIntoConstraints = false
    mysubview.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
    mysubview.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
    mysubview.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
    mysubview.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true
    
    mysubview.addSubview(button)
    
    button.translatesAutoresizingMaskIntoConstraints = false
    button.topAnchor.constraint(equalTo: mysubview.topAnchor, constant: 20).isActive = true
    button.leadingAnchor.constraint(equalTo: mysubview.leadingAnchor, constant: 20).isActive = true
    button.trailingAnchor.constraint(equalTo: mysubview.trailingAnchor, constant: -20).isActive = true
    button.heightAnchor.constraint(equalToConstant: 50).isActive = true
}

 @objc func myfunc() {
    print("clicked")
 }
}