ReactiveCocoa-UI-Button

新项目中使用了ReactiveCocoa框架,然后在使用过程中遇见的问题记录一下
今天遇见了UIButton的使用
传统的UIButton Target Action 方式

之前我们使用UIButton的点击方法一般有两种。一种是直接从xib里面拖一个IBAction出来在里面写代码。

另外一种是代码创建的 比如这样

UIButton *myButton = [[UIButton alloc] init…];
[myButton addTarget:something action:@selector(myAction) forControlEvents:UIControlEventTouchUpInside];
然后在下面写一个myAction的方法来进行操作。

这样对我来说存在两个问题:

button对应的方法分开了。在阅读代码的时候,当我想知道这个button对应的方法或者反过来action方法对应的button。通常需要跳转一次以上才能知道。(也许是我的阅读代码习惯比较原始)
我在action方法里面如果需要引用一个变量的时候,无法使用局部变量。通常就需要把这个资源设计为一个property。尽管这个资源或者变量只是在action里面调用一次。(这个也许是我写代码的问题)
这两个可能在我遇见ReactiveCocoa都不能叫问题。但是在ReactiveCocoa里面我发现了更加优美的解决方法。好开心。

ReactiveCocoa方式的UIButton

由于ReactiveCocoa高深的知识点,我也弄不太清楚。下面我只是说明怎么用的hello world级别。更多内容请阅读github上的项目主页。

如果使用xib。只需拖一个IBOutlet的property出来。比如这样

@property (weak, nonatomic) IBOutlet UIButton xibButton;
NSString
helloWorld = @”hello world!!!”;
self.xibButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@”%@”, helloWorld);
return [RACSignal empty];
}];
如果是代码创建一切照旧

NSString helloWorld = @”hello world!!!”;
UIButton
myButton = [UIButton buttonWithType:UIButtonTypeSystem];
myButton.frame = CGRectMake(0, 0, 100, 50);
[myButton setTitle:@”Say” forState:UIControlStateNormal];
[self.view addSubview:myButton];
myButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@”%@”, helloWorld);
return [RACSignal empty];
}];
这些代码我一般写在viewDidLoad方法里面。当然你可以在正确的地方使用他们。
运行试试。哇。魔法一般。完全解决我在传统的UIButton遇到的两个问题。

Best Wishes