从UIButton的类中获取当前的UIViewController

时间:2014-08-05 17:46:34

标签: ios objective-c uiviewcontroller uibutton

我有自定义UIButton,它通过协议以编程方式与ViewController方法交互(触发器)。但是按钮的行为必须依赖于放置的ViewController。我这样做是为了最小化ViewControllers本身的代码量,因为按钮必须保持不变并具有相同的功能(导航)。 在UIButton的自定义类中是否有任何方法可以将它放置在ViewController上?

1 个答案:

答案 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;