我以编程方式创建了一个UIView并添加了一个UIButton作为它的子视图.
我希望UIViewController成为该按钮操作的目标.
我该怎么办?
如果它是由Interface Builder创建的,那么使用IBAction很容易.
我希望UIViewController成为该按钮操作的目标.
我该怎么办?
如果它是由Interface Builder创建的,那么使用IBAction很容易.
解决方法
如果您以编程方式将按钮添加到UIView的子类,那么您可以通过以下两种方式之一执行此操作:
>您可以使按钮成为视图的属性,然后在实例化视图的viewController中,您可以按如下方式设置按钮的目标:
- [viewSubclass.buttonName addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
这会将按钮的目标设置为viewController.m中buttonTapped的方法
>您可以在子视图中创建协议,父视图控件将遵循该协议.在您的视图中,当您添加按钮时,将其设置为在视图中调用方法.然后从该视图中调用委托方法,以便viewController可以响应它:
在顶部您的视图子类.h创建协议:
- @protocol ButtonProtocolName
- - (void)buttonWasPressed;
- @end
为委托创建属性:
- @property (nonatomic,assign) id <ButtonProtocolName> delegate;
在子类.m中设置按钮选择器:
- [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
- - (void)buttonTapped:(id)sender {
- [self.delegate buttonWasPressed];
- }
在viewController.h中,您需要确保它符合协议:
- @interface someViewController : UIViewController <SomeButtonProtocolName>
在初始化子视图时,在viewController.m中,您必须设置委托:
- SomeView *view = ... // Init your view
- // Set the delegate
- view.delegate = self;
最后,将delegate方法buttonWasPressed添加到viewController.m:
- - (void)buttonWasPressed {
- // Put code here for button's intended action.
- }
更新以提供Swift示例
- // Simple delegate protocol.
- protocol SomeViewDelegate: class {
- // Method used to tell the delegate that the button was pressed in the subview.
- // You can add parameters here as you like.
- func buttonWasPressed()
- }
- class SomeView: UIView {
- // Define the view's delegate.
- weak var delegate: SomeViewDelegate?
- // Assuming you already have a button.
- var button: UIButton!
- // Once your view & button has been initialized,configure the button's target.
- func configureButton() {
- // Set your target
- self.button.addTarget(self,action: #selector(someButtonPressed(_:)),for: .touchUpInside)
- }
- @objc func someButtonPressed(_ sender: UIButton) {
- delegate?.buttonWasPressed()
- }
- }
- // Conform to the delegate protocol
- class SomeViewController: UIViewController,SomeViewDelegate {
- var someView: SomeView!
- func buttonWasPressed() {
- // UIViewController can handle SomeView's button press.
- }
- }
另外,这是一个使用闭包而不是委托的快速示例. (这也可以使用块在ObjC中实现.)
- // Use typeAlias to define closure
- typealias ButtonPressedHandler = () -> Void
- class SomeView: UIView {
- // Define the view's delegate.
- var pressedHandler: ButtonPressedHandler?
- // Assuming you already have a button.
- var button: UIButton!
- // Once your view & button has been initialized,for: .touchUpInside)
- }
- @objc func someButtonPressed(_ sender: UIButton) {
- pressedHandler?()
- }
- }
- class SomeViewController: UIViewController {
- var someView: SomeView!
- // Set the closure in the ViewController
- func configureButtonHandling() {
- someView.pressedHandler = {
- // UIViewController can handle SomeView's button press.
- }
- }
- }