gpt4 book ai didi

objective-c - ReactiveCocoa 根据 NSTableView 选择状态启用 NSButton

转载 作者:太空狗 更新时间:2023-10-30 03:58:47 25 4
gpt4 key购买 nike

我刚刚开始学习 Reactive Cocoa。我正在编写 cocoa 应用程序,只有在 NSTableView 中至少选择了一行时我才想启用 NSButton。

我在 awakeFromNib 中使用以下代码

RACSignal *enableSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
@strongify(self);
if ([self.genreListTableView numberOfSelectedRows] > 0) {
[subscriber sendNext:@YES];
} else {
[subscriber sendNext:@NO];
}
return nil;
}];

[self.addButton rac_liftSelector:@selector(setEnabled:)
withSignals:enableSignal,nil];

此代码执行良好,并在应用程序启动期间禁用了 addButton,因为最初没有选择行。

我想在选择 TableView 条目时启用添加按钮。我不知道如何以 react 方式实现。

我可以通过以下方式实现所需的行为。不确定这是否是实现它的正确方法。

     [[self rac_signalForSelector:@selector(tableViewSelectionDidChange:)
fromProtocol:@protocol(NSTableViewDelegate)] subscribeNext:^(RACTuple *value) {
NSNotification *notification = value.first;
if (self.genreListTableView == notification.object) {
if ([self.genreListTableView numberOfSelectedRows] > 0) {
[self.addButton setEnabled:TRUE];
} else {
[self.addButton setEnabled:FALSE];
}
}
}];

任何以 react 方式处理需求的建议都将受到赞赏。

谢谢

最佳答案

您走在正确的轨道上。您应该进行一些更改以简化操作。

首先,使用 RAC() 宏对属性进行这样的简单绑定(bind)。

RAC(self.addButton, enabled) = /* A signal */;

这将导致编译错误,因为没有为 enabled 声明属性(并且 getter 被命名为 isEnabled,而不仅仅是 `enabled)。这可以通过类别非常简单地解决:

@interface NSButton (EnabledProp)

@property (assign, nonatomic, getter = isEnabled, setter = setEnabled:) BOOL enabled;

@end

然后,您可以使用另一个宏 RACObserve() 直接从 TableView 的 numberOfSelectedRows 构造信号。

RAC(self.addButton, enabled) = RACObserve(self.genreListTableView, numberOfSelectedRows);

但这需要是 BOOL 才能作为绑定(bind)有意义。将一种值(value)转化为另一种值(value)?那是一个 map :

RAC(self.addButton, enabled) = [RACObserve(self.genreListTableView, numberOfSelectedRows) map:^id (NSNumber * numSelected){
return @([numSelected integerValue] > 0);
}];

numberOfSelectedRows 中的 NSInteger 在信号中时被包裹在 NSNumber 中,因此打开它,与零进行比较,然后将比较结果包装起来。

关于objective-c - ReactiveCocoa 根据 NSTableView 选择状态启用 NSButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21146002/

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