对uicontrol的nextresponder感到困惑

时间:2019-01-29 07:57:15

标签: ios first-responder

如果将UIView添加为UIViewControler视图的子视图,并且不将事件添加到UIView。 UIViewControler的方法将被调用。但是,如果您将UIView添加为UIButton的子视图,并且不向UIView添加事件,则不会调用按钮单击事件,这让我感到困惑。当您将按钮添加为UIView的子视图时,也发生了这种情况,按钮没有添加target-action方法,它的superview(UIView)也没有调用任何方法。

1 个答案:

答案 0 :(得分:0)

假设您的问题是这样的:为什么点击UIButton的水龙头不会让UIViewController视图的touchesBegan方法被调用?

让我们看一下这个实验项目,为了简单起见,我使用框架而不是约束。

import UIKit

class MyButton: UIButton {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        print("BUTTON TOUCHES BEGAN")
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        self.view.backgroundColor = .white

        let view1 = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        view1.backgroundColor = .black
        self.view.addSubview(view1)

        let button = MyButton(type: .custom)
        button.frame = CGRect(x: 200, y: 100, width: 100, height: 100)
        button.setTitle("XXX", for: .normal)
        button.backgroundColor = .yellow
        button.setTitleColor(.black, for: .normal)
        button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
        self.view.addSubview(button)

        let view2 = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
        view2.backgroundColor = .red
        button.addSubview(view2)

    }

    @objc func buttonClicked() {
        print("buttonClccked")
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)

        print("TOUCHES BEGAN")
    }
}

我做了你提到的每一个案例。

view1是普通视图。将其添加为控制器视图的子视图,然后点击它会触发控制器中的touchesBegan。很好。

view2被添加为按钮的子视图,而不考虑按钮的整个框架,然后点击view2,按钮的touchesBegan被触发控制器的。添加

之所以发生这些事情,是因为当您点击按钮时,点击按钮的优先级高于控制器的视图,因为从按钮开始的每次触摸都被视为点击。