NSArray更新绑定到阵列控制器的表视图

时间:2015-08-03 10:52:11

标签: objective-c arrays cocoa nsmutablearray

我有一个NSArray绑定到阵列控制器,阵列控制器再次绑定到NSTableView。

  • 包含模型的数组,每个模型都定义了属性属性,有些属性具有未定义的关键属性。我希望在一段时间后或某些事件中替换。
  • 我有NSModifiedArray这是NSArray的子​​类。
  • NSModifiedArray具有addModifiedObject和removeModifiedObject的自定义方法。
  • 一段时间后,数组中的对象需要替换事件上的某些对象,当我在自定义类(NSModifiedArray)中执行替换对象时,Array Controller不会更新表视图。

那么如何更新数组控制器而不在NSArrayController上调用rearrangeObjects,而是在我所做的自定义类中调用(NSModifiedArray NSMutableArray的子​​类)。我只是想知道如何对此进行KVO调用,如果是,那么如何?

@interface NSModifiedArray : NSMutableArray
@end

@implementation NSModifiedArray

/** Trying to replace the objects in an array **/
-(void)objectAtIndex:(NSUInteger)index withArray:(NSArray *)inArray
{
    /* A Subset of array is passed to this method, if the index passed     contains a null value then replace with the subset passed. */
    if([[super objectAtIndex:index] isKindOfClass:[NSNull class]]) {
        /* replace the subset, After successfull replace the instance of this class binded to array controller doesn't update in UI, So i'm unable to see the replaced objects on the UI, even its updated and replaced successfully. Keeping a break and doing NSLog will show me the replaced objects. */

        [self replaceObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(index,[inArray count])] withObjects:inArray];
    }
}
@end

1 个答案:

答案 0 :(得分:0)

您应该将您的方法作为类别的一部分。

或者,创建一个具有NSMutableArray属性的新类。

您不希望将NSMutableArray子类化为您正在执行的操作,因为有很多条件是您未通过覆盖{{{{{{[{[{ 3}}和NSMutableArray reference

  

子类注释

     

通常没有理由继承NSMutableArray。该类完成了它的设计目的 - 维护一个可变的,有序的对象集合。但有些情况下,自定义NSArray对象可能会派上用场。以下是一些可能性:

     

更改NSMutableArray存储其集合元素的方式。出于性能原因或与旧代码的更好兼容性,您可能会这样做。

     

获取有关集合发生情况的更多信息(例如,统计信息收集)。

     

覆盖方法

     

NSMutableArray定义了五种基本方法:

     
      
  • insertObject:atIndex:

  •   
  • removeObjectAtIndex:

  •   
  • ADDOBJECT:

  •   
  • removeLastObject

  •   
  • replaceObjectAtIndex:withObject:

  •   
     

在子类中,您必须覆盖所有这些方法。您还必须覆盖NSArray类的基本方法。

在NSArray文档中,它继续:

  

NSArray的任何子类都必须覆盖原始实例方法count和objectAtIndex:。这些方法必须在您为集合元素提供的后备存储上运行。对于此后备存储,您可以使用静态数组,标准NSArray对象或某些其他数据类型或机制。您也可以选择部分或完全覆盖要为其提供替代实现的任何其他NSArray方法。

     

您可能希望为子类实现适合于子类正在管理的后备存储的初始化程序。如果这样做,初始化程序必须调用NSArray类的指定初始值设定项之一,init或initWithObjects:count:。 NSArray类采用NSCopying,NSMutableCopying和NSCoding协议;如果您希望通过复制或编码创建自己的自定义子类的实例,请覆盖这些协议中的方法。

     

请记住,NSArray是类集群的公共接口,以及它对您的子类的要求。您必须为子类提供存储并实现直接作用于该存储的基本方法。

     

子类化的替代

     

在创建NSArray的自定义类之前,请研究NSPointerArray和相应的Core Foundation类型CFArray Reference。因为NSArray和CFArray是“免费桥接”,所以您可以在代码中用CFArray对象替换NSArray对象(使用适当的转换)。虽然它们是相应的类型,但CFArray和NSArray没有相同的接口或实现,有时你可以用CFArray做一些你不能轻易用NSArray做的事情。例如,CFArray提供了一组回调,其中一些回调用于实现自定义保留释放行为。如果为这些回调指定NULL实现,则可以轻松获得非保留数组。

     

如果要添加的行为补充现有类的行为,则可以在NSArray上编写类别。但请记住,此类别对您使用的所有NSArray实例都有效,这可能会产生意想不到的后果。或者,您可以使用合成来实现所需的行为。

我认为"类集群"正在发生什么?这些东西是Apple的私有子类,如__NSArrayI__NSArrayM,它们具有您需要复制的功能,因为您无法对这些私有子类进行子类化。