我有自定义UIButton,它通过协议以编程方式与ViewController方法交互(触发器)。但是按钮的行为必须依赖于放置的ViewController。我这样做是为了最小化ViewControllers本身的代码量,因为按钮必须保持不变并具有相同的功能(导航)。 在UIButton的自定义类中是否有任何方法可以将它放置在ViewController上?
答案 0 :(得分:1)
我会以特定的方式关注@rmaddy的建议,借鉴SDK的风格
// MyCutomButton.h
@protocol MyCustomButtonDatasource;
@interface MyCustomButton : UIButton
@property(weak,nonatomic) IBOutlet id<MyCustomButtonDatasource>datasource;
// etc
@end
@protocol MyCustomButtonDatasource <NSObject>
@optional
- (NSString *)howShouldIBehave:(MyCustomButton *)button;
@end
现在按钮可以在IB中设置数据源。查看包含它的控制器将需要一些额外的代码(对不起,这在一个好的设计中是不可避免的)。他们将自己声明为实现MyCustomButtonDatasource。
当MyCustomButton需要根据放置的位置有条件地行动时,它可以询问其数据源......
// MyCustomButton.m
NSString *string = @"defaultBehavior"; // per @RichardTopchiy's suggestion
if ([self.datasource respondsToSelector:@selector(howShouldIBehave:)])
string = [self.datasource howShouldIBehave:self];
// string is just made-up here, have it answer something simple (int, BOOL)
// that lets the button proceed with the right behavior. Don't ask for
// anything that relies on specific knowledge of how MyCustomButton
// is implemented
编辑 - 要创建关系,如果您将属性修饰为IBOutlet(如上所示),您应该能够在IB中设置关系。将视图控制器声明为实现<MyCustomButtonDatasource>
。选择自定义按钮,然后选择连接检查器,然后拖动到视图控制器。
或者,将按钮本身设置为视图控制器中的IBOutlet属性,并在viewDidLoad中执行:
self.customButton.datasource = self;
最后一种方法是给你的按钮一个标签,比如128,然后:
MyCustomButton *customButton = (MyCustomButton *)[self.view viewWithTag:128];
self.customButton.datasource = self;