【问题标题】:Observe Count Property of NSMutableArray Object观察 NSMutableArray 对象的 Count 属性
【发布时间】:2011-08-08 17:28:39
【问题描述】:

我想观察 NSMutableArray 对象的 count 属性。每当添加或删除对象时,我都能够直接观察数组的变化,方法是利用索引数组访问器进行一对多关系。但是,我想简单地观察 count 属性,这样当我使用我的 observeValueForKeyPath 方法时,传递给参数的对象是数组对象本身,而不是保存数组的类。

我的情况如下:

我有一个 NSMutableArray *cards 在我的 AppDelegate 类中声明为属性(和 ivar)。

从我的视图控制器,我尝试观察这个数组的计数属性:

[appDelegate.cards addObserver:self forKeyPath:@"count" options:0 context:NULL];

但是,这会使我的程序崩溃并出现以下错误:

[<__NSArrayM 0x4e17fd0 addObserver:forKeyPath:options:context] is not supported. Key path: count'

我已经尝试实现一对多关系的访问器

- (void)addCardsObject:(Card *)anObject;
- (void)removeCardsObject:(Card *)anObject;

但是,程序仍然崩溃。

我有几个问题:

  1. 我怎样才能观察到这个 NSMutableArray 的计数属性?
  2. NSMutableArray 的计数属性是定义为一对一关系,还是在确定它是一对多还是一对一关系时重要的整个对象(NSMutableArray 是一个集合对象,因此它是一个-many 关系,即使我只是想观察计数属性,而不是集合中对象的属性)。

提前致谢。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    NSArray 本身就是不支持 KVO,句号。它是您需要观察的阵列前面的控制器。例如,如果你有一个 NSArrayController,你可以为arrangedObjects.count 设置一个观察者。

    【讨论】:

    • 是否可以通过编程方式实现这一点,而不是使用 IB?如果没有,有没有其他方法可以做到这一点?我正在尝试在我的应用程序中以编程方式完成所有操作。
    • @Jim Hubbard:是的。 KVO 可通过编程方式完全访问:google.com/…
    • 不是 KVO,创建一个 NSArrayController 对象并使用它。我搜索了教程,但似乎我找到的所有教程都是如何通过接口构建器实现 NSArrayController。
    • @Jim Hubbard:您并不严格需要 NSArrayController — 任何类型的数组属性兼容 KVO 的控制器都应该可以工作。听起来您已经有一个实现索引访问器方法的控制器,所以我就使用它。 (不过,您可以在代码中设置 NSArrayController。您只需要发送 bind:… 消息,而不是在 Interface Builder 中填写绑定表单。)
    【解决方案2】:

    得知 NSarry、NSMutableArray 不支持 KVO 真是令人难过。当我想使用反应可可来观察选择时,我遇到了这个问题。

    但幸运的是,UIViewController 是 KVO 兼容的。

    //create a readonly property selectionCount
    @property (nonatomic, readonly)NSInteger selectionCount;
    ...
    
    //Implement the getter method
    -(NSInteger)selectionCount{
        return self.arrSelection.count;
    }
    ...
    
    RAC(self.btnConfirm, enabled) = [RACSignal combineLatest:@[RACAbleWithStart(self.selectionCount)] reduce:^(NSNumber *count){
            return @([count integerValue] > 0);
        }];
    

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2012-12-14
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多