gpt4 book ai didi

ios - 在 ReactiveCocoa 中通过 UIButton 切换 View 的可见性

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:16:00 28 4
gpt4 key购买 nike

我的 View 中有一个按钮,它可以使另一个 View 进出动画。菜单按钮可能显示和隐藏菜单的方式相同。这是我现在拥有的:

- (void) declareBindings {
self.myButton.rac_command = self.toggleMenuCommand;
}


- (RACCommand *) toggleMenuCommand {
if (!_toggleMenuCommand) {
@weakify(self);
_toggleMenuCommand = [[RACCommand alloc] initWithEnabled:[RACSignal return:@(YES)] signalBlock:^RACSignal *(id sender) {
@strongify(self);
if (!self.menuView.isShowing) {
[self showMenu];
}else{
[self hideMenu];
}
return [RACSignal empty];
}];
}
return _toggleMenuCommand;
}

问题在于它迫使我将状态存储在 self.menuView.isShowing 中。我很确定这不是正确的方法。我怎样才能改变它,使按钮在隐藏和显示菜单之间交替,而不存储状态?

编辑:好的,我最好的猜测是创建单独的命令来显示和隐藏菜单,然后每次都将另一个命令设置为副作用。很想听听任何更好的想法!

最佳答案

这是一个例子,它可能不是最好的,但我认为它值得注意。我经常使用“提升”来删除对 self 的引用(因此削弱/加强)......我玩弄了你的代码并得到了这样的工作:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

_toggleMenuCommand = [[RACCommand alloc] initWithEnabled:[RACSignal return:@(YES)] signalBlock:^RACSignal *(id sender) {
return [RACSignal return:sender];
}];

RACSignal *menuView = [RACSignal return:self.menuView];
RACSignal *buttonToggled = [_toggleMenuCommand.executionSignals flatten];

RACSignal *changeVisibility = [RACSignal combineLatest:@[buttonToggled, menuView] reduce:^NSNumber *(UIView *button, UIView *menuView) {
return [NSNumber numberWithBool:menuView.hidden];
}];

[self rac_liftSelector:@selector(setMenuVisibility:)
withSignalsFromArray:@[changeVisibility]];

self.myButton.rac_command = _toggleMenuCommand;
}

- (void)setMenuVisibility:(NSNumber *)visible {
self.menuView.hidden = ![visible boolValue];
}

我不确定这是否需要解释。本质上,由于每当 changeVisibility 信号触发时带有 rac_liftSelector 的行,广播的消息(对象)将传递给 setMenuVisibility 方法。值得注意的是,所有 NSNumber 的东西都与我们不能传递 BOOL 的事实有关,因为它不是一个对象。

我自己仍在学习这些东西,但希望对您有所帮助。

关于ios - 在 ReactiveCocoa 中通过 UIButton 切换 View 的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24195229/

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