Enable/disable 基于 NSMutableArray 中计数的按钮

Enable/disable a button based on count in NSMutableArray

我有一个带有按钮的视图控制器,如果 myArray.count > 0 我想启用它。我最初让 KVO 工作,但它没有更新。

我的按钮 属性 在这里声明:

@property (strong, nonatomic) IBOutlet UIBarButtonItem *saveButton;

我想 enable/disable 基于数组中项目数的按钮:

@property (nonatomic, strong) NSMutableArray *myArray;

项目通过 didSelectRowAtIndexPath

added/removed 到数组

我发现了一些关于观察 NSMutableArray 的 post,我所看到的每个 post 似乎都有大量的代码来实现如此简单的东西。

我在 myArray 实例化后将其添加到 viewDidLoad

// Add KVO for array
[self.saveButton addObserver:self forKeyPath:@"myArray" options:(NSKeyValueObservingOptionInitial) context:nil];

我添加了这个方法来在 myArray:

发生变化时做一些事情
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"myArray"]) {
        if (self.myArray.count > 0) {
            NSLog(@"KVO: myArray.count > 0");
            [self.saveButton setEnabled:YES];
        } else {
            NSLog(@"KVO: myArray.count is ZERO");
            [self.saveButton setEnabled:NO];
        }
    }
}

我知道我遗漏了一些简单的东西,但事实证明是难以捉摸的。

如果只能通过 didSelectRowAtIndexPath 编辑数组,那么为什么不直接 enable/disable 那里的按钮。

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  {
    //current code    

    if (self.myArray.count > 0) {
        NSLog(@"KVO: myArray.count > 0");
        [self.saveButton setEnabled:YES];
    } else {
        NSLog(@"KVO: myArray.count is ZERO");
        [self.saveButton setEnabled:NO];
    }
}

问题是 NSMutableArray 不遵守 KVO,因此如果您正确访问数组,观察关键路径计数将不会 work.This 将起作用:

something = [self mutableArrayValueForKey:@"a"]; 
[something addObject:foo];

您可能会在这里得到答案: KVO With NSMutableArray

Observing count in NSMutableArray

对于中文[观察NSMutableArray中的计数] 您可能会在 :

得到答案

改变

// Add KVO for array
[self.saveButton addObserver:self forKeyPath:@"myArray" options:(NSKeyValueObservingOptionInitial) context:nil];

// Add KVO for array
[self addObserver:self forKeyPath:@"myArray" options:(NSKeyValueObservingOptionInitial) context:nil];