【问题标题】:How to use mutableArrayValueForKey for KVO?如何将 mutableArrayValueForKey 用于 KVO?
【发布时间】:2015-12-25 10:09:46
【问题描述】:

首先:我已经在这里阅读了几次与此问题相关的问题,我发布此内容时意识到人们可能会认为这是一个重复的问题。但是我不得不说,作为一个初学者,我还没有找到任何有用的信息,所以我带着这个问题希望能对我和其他人说清楚。

我如何理解 Bindings & KVC / KVO

考虑一下:我有一个数组(在我的 AppDelegate 中)、一个 ArrayController 和一个视图元素,比如 NSTableView。我已将 AppDelegate 中的 NSMutableArray 绑定到 ArrayController,而后者又绑定到 NSTableView。

在 NSTableView 中更改某些对象的属性会导致该对象的属性发生实际更改。到目前为止它有效。但是,更改 NSMutableArray 中的某些内容(例如添加项目)不会更新 NSTableView。

我读过的可能的解决方案

我现在已经阅读了多个答案。一个答案似乎表明我不应该向数组本身添加任何内容,而只能向 ArrayController 添加任何内容。我不确定这是否正确,但如果这是一个可能的解决方案,最好了解更多有关如何执行此操作的详细信息。

其他解决方案提到以下方法:

  • valueForKey:
  • valueForKeyPath:
  • dictionaryWithValuesForKeys:
  • valueForUndefinedKey:
  • mutableArrayValueForKey:

特别是:

  • mutableArrayValueForKey:

如何使用 mutableArrayValueforKey?

知道的是如何在我的应用程序中将这些方法与我的数组/ 一起使用。 mutableArrayValueForKey 方法返回一个 NSMutableArray。我必须用这个创建一个新数组吗?

现在,我正在做的就是这个。

self.vocabList = [[NSMutableArray alloc] init];

稍后,在一个方法中,我正在填充数组:

for (NSObject* o in meaningsArray)
{
    NSLog(@"%@",o);

    Vocab *temp = [[Vocab alloc] init];

    [temp setValue:@"w" forKey:@"word"];
    [temp setValue:@"m" forKey:@"meaning"];

    [self.vocabList insertObject:temp atIndex:[self.vocabList count]];
}

如果到目前为止我所说的一切都是正确的,我的问题是: mutableArrayValueForKey: 在想要更新 NSTabeleView 时会出现在哪里?还是我一开始就误会了什么?

【问题讨论】:

    标签: objective-c nsmutablearray nstableview key-value-observing cocoa-bindings


    【解决方案1】:

    如果你想改变你的数组并观察变化,你应该在这个数组的可变代理中进行更改,而不是在数组本身中。 mutableArrayValueForKey: 返回可变代理对象

    例如:

    我有数组:

    NSMutableArray* selectedIndexPaths;
    

    我添加观察者:

    [self addObserver:self forKeyPath:@"selectedIndexPaths" options:0 context:NULL];
    

    检查变更方法:

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if([keyPath isEqualToString:@"selectedIndexPaths"]) {...}}
    

    改变数组的方法:

    - (void)removeObjectFromSelectedIndexPathsAtIndex:(NSUInteger)index{
        NSMutableArray* arr = [self mutableArrayValueForKey:@"selectedIndexPaths"];
        if (arr) [arr  removeObjectAtIndex:index];
    }
    
    - (void) addIndexPathToSelected : (NSIndexPath*) object{
    NSMutableArray* arr =[self mutableArrayValueForKey:@"selectedIndexPaths"];
    if (arr) {
        [arr addObject:object];
    }
    }
    

    转换器的使用:

    - (void)removeAllObjects{
        int count = [selectedIndexPaths count];
        for (int i=count-1;i>-1;i--) {
            [self removeObjectFromSelectedIndexPathsAtIndex:i];
        }
    }
    

    【讨论】:

    • 非常感谢。我添加了一个观察者,这似乎没问题。但我不明白我必须在哪里实现 checkchanges 方法和 changesmthinarray 方法?此外,当我尝试向数组中添加一些内容时,我收到“收到消息但未处理”错误。 :(
    • 一切都是单一课程的一部分。 (在我的例子中,它是 ViewController)首先,尝试在viewDidLoad 中添加观察者,例如。 observeValueForKeyPath: 方法是 KVO 的默认方法,所以把它放在你班级的某个地方。在系统接收有关对象更改的通知时调用此方法。在这里,数组已经包含更改。 changesmthinarray的使用:- (void)removeAllSelectedObjects{ int count = [selectedIndexPaths count]; for (int i=count-1;i>-1;i--) { [self removeObjectFromSelectedIndexPathsAtIndex:i]; } }
    【解决方案2】:

    简单的解决方案:不要与您的阵列交谈,而是与您的阵列控制器交谈。而不是[array addObject:…][arrayController addObject:…],而不是[array removeObject:…][arrayController removeObject:…] 等等。

    来自 CheshireKat 的解决方案:

    NSMutableArray *mutableArray = [self mutableArrayValueForKey:@"vocabList"];
    for (NSObject* o in meaningsArray)
    {
        NSLog(@"%@",o);
    
        Vocab *temp = [[Vocab alloc] init];
    
        [temp setValue:@"w" forKey:@"word"];
        [temp setValue:@"m" forKey:@"meaning"];
    
        [mutableArray insertObject:temp atIndex:[mutableArray count]];
    }
    

    另一种解决方案:如果要整个数组,请填充一个数组并再次设置vocabList

    NSMutableArray *mutableArray = [NSMutableArray array];
    for (NSObject* o in meaningsArray)
    {
        NSLog(@"%@",o);
    
        Vocab *temp = [[Vocab alloc] init];
    
        [temp setValue:@"w" forKey:@"word"];
        [temp setValue:@"m" forKey:@"meaning"];
    
        [mutableArray addObject:temp];
    }
    self.vocabList = mutableArray;
    

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多