微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 如何添加UIViewController作为在以编程方式创建的UIView中创建的UIButton操作的目标?

我以编程方式创建了一个UIView并添加一个UIButton作为它的子视图.
我希望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];

在buttonTapped:方法调用委托方法

- (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.
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐