gpt4 book ai didi

ios - ReactiveCocoa 结合最新的按钮按下和文本字段委托(delegate)信号

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:50 26 4
gpt4 key购买 nike

我创建了一个信号来包装 UITextField 委托(delegate)方法 textFieldShouldReturn:

- (RACSignal *)textFieldReturnPressed
{
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[[self rac_signalForSelector:@selector(textFieldShouldReturn:)
fromProtocol:@protocol(UITextFieldDelegate)]
subscribeNext:^(RACTuple *tuple) {
[subscriber sendNext:tuple.first];
}];

return nil;
}];
}

在 viewDidLoad 中,我尝试订阅此信号和按钮按下的组合。实际上,我希望用户能够点击一个按钮并做一些事情(登录),或者按下键盘上的回车键并做同样的事情(登录)。

我创建了以下信号来组合这两个信号:

RACSignal *loginSignal = [RACSignal
combineLatest:@[[loginButton
rac_signalForControlEvents:UIControlEventTouchUpInside],
[self textFieldReturnPressed]]];

然后我像这样订阅这个事件:

[loginSignal
subscribeNext:^(id x) {
NSLog(@"%@", x);
}];

当我按下键盘上的返回键时,上面的日志没有打印出来(尽管我已经验证了从信号中调用了 sendNext)。但是,当我触发登录按钮信号时,日志会打印出来。 combineLatest 通过信号。

我已经尝试将 startWith:nil 添加到 loginButton 信号,因为正如我在其他帖子/Github 问题中发现的那样,CombineLatest 要求每个信号至少发送一次,但我的流会立即执行。

我确定我可以在那个时候以某种方式进行过滤以防止流执行,但这感觉有点老套。有什么建议吗?

最佳答案

combineLatest 没有达到预期效果的原因是它需要传递的每个信号至少发送一个下一个事件,以便订阅者开始接收下一个事件。

要达到您想要的效果,即两个信号,每个信号都传递下一个事件,而不管对方的状态如何,您应该合并:信号。

例子:

RACSignal *loginSignal = [[loginButton 
rac_signalForControlEvents:UIControlEventTouchUpInside]
merge:[self textFieldReturnPressed]];

关于ios - ReactiveCocoa 结合最新的按钮按下和文本字段委托(delegate)信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com