如果您以编程方式将按钮添加到 UIView 的子类,则可以通过以下两种方式之一进行:
-
你可以让按钮成为视图的属性,然后在实例化视图的viewController中你可以设置按钮的目标如下:
[viewSubclass.buttonName addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
这会将按钮的目标设置为 buttonTapped: 在 viewController.m 中的方法
您可以在子视图中创建一个协议,父视图控制器将遵守该协议。在您的视图中,当您添加按钮时,将其设置为调用视图中的方法。然后从该视图调用委托方法,以便您的 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;
最后,将委托方法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, configure the button's target.
func configureButton() {
// Set your target
self.button.addTarget(self, action: #selector(someButtonPressed(_:)), 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.
}
}
}