根据NSMutableArray

时间:2015-05-21 15:19:59

标签: ios objective-c key-value-observing

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

我的按钮属性在此处声明:

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

我想根据数组中的项目数启用/禁用按钮:

@property (nonatomic, strong) NSMutableArray *myArray;

通过didSelectRowAtIndexPath

将项目添加/移除到数组中

我发现了一些关于观察NSMutableArray主题的帖子,我发现的每个帖子似乎都有大量的代码来实现这么简单的事情。

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

// 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];
        }
    }
}

我知道我错过了一些简单的事情,但事实证明这是难以捉摸的。

2 个答案:

答案 0 :(得分:1)

如果只能通过didSelectRowAtIndexPath编辑数组,那么为什么不在那里启用/禁用按钮。

 -(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];
    }
}

答案 1 :(得分:0)

问题是NSMutableArray不尊重KVO,因此观察密钥路径计数将不起作用。如果正确访问数组,这将有效:

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];