让我先描述我的问题。我有一个包含NSMutableDictionary ivar的类。有一个线程可以在字典中添加新的对-在编写应用程序时,我还没有完整的可用键列表。所有这些对的最新列表必须在表视图中显示。
我准备了一个小的概念证明应用程序,在xib文件中创建了一个词典控制器,其内容与词典ivar绑定在一起。问题在于“表视图”仅显示字典内容的初始集合。插入后不会刷新。

在我的概念证明应用程序AppController.h中,如下所示:

#import <Foundation/Foundation.h>

@interface AppController : NSObject

@property (strong) NSMutableDictionary *dictionary;

- (NSString *)randomString;
- (IBAction)addRandomPair:(id)sender;

@end


并执行文件内容:

#import "AppController.h"

@implementation AppController

@synthesize dictionary = _dictionary;

- (id)init {
    self = [super init];
    if (self) {
        _dictionary = [[NSMutableDictionary alloc] init];
        [_dictionary setValue:@"Aa" forKey:@"A"];
        [_dictionary setValue:@"Bb" forKey:@"B"];
    }
    return self;
}

- (NSString *)randomString
{
    NSMutableString *aString = [[NSMutableString alloc] init];
    for (int i = 0; i < 3; i++) {
        NSUInteger r = random() % ('z' - 'a');
        [aString appendString:[NSString stringWithFormat:@"%c", ('a' +r)]];
    }
    return aString;
}

- (IBAction)addRandomPair:(id)sender
{
    [self.dictionary setValue:[self randomString] forKey:[self randomString]];
    NSLog([self.dictionary description]);
}

@end


字典控制器内容绑定到App控制器,并且模型键路径设置为“ self.dictionary”,表视图中的列内容绑定到字典控制器,并将模型键路径设置为键和值。在此概念验证应用程序按钮中,单击添加一个新对(addRandomPair:操作)。

我在NSMutableArray和Array Controller上也遇到了类似的问题,但是在这里我可以通过向持有数组ivar的类中添加以下对方法来解决该问题(该类中的命名数据):

- (void)insertObject:(NSString *)object inDataAtIndex:(NSUInteger)index;
- (void)removeObjectFromDataAtIndex:(NSUInteger)index;


是否可以向持有字典(AppController)的类中添加一些其他方法以通知有关新插入的信息?也许有更好的解决方案来解决我的问题?

更新资料

我发现实现以下一组访问器会使Dictionary Controller收到有关新项的通知:

- (void)addDictionaryObject:(NSString *)object;
- (void)removeDictionaryObject:(NSString *)object;


问题是addDictionaryObject:仅具有一个参数,字典需要类似addDictionaryObject:forKey:的内容。有任何想法吗?

更新2

除了使用手动更改通知外,没有其他解决方案-在这种情况下,addRandomPair:方法如下所示:

- (IBAction)addRandomPair:(id)sender
{
    [self willChangeValueForKey:@"dictionary"];
    [self.dictionary setValue:[self randomString] forKey:[self randomString]];
    [self didChangeValueForKey:@"dictionary"];
    NSLog([self.dictionary description]);
}


它可以工作,但是我仍然不确定,因为字典本身不会改变,但是内容会改变。在这里使用手动更改通知是正确的方法吗?

最佳答案

Key-Value Coding methods文档中,对许多属性仅支持NSMutableArrayNSMutableSet。由于KVC已经可以使用键,因此支持NSMutableDictionary是多余的,因为它实际上是setValue:forKey:已经完成的工作。

如果您真的希望在一次呼叫中这样做,则可以覆盖setValue:forKeyPath:

关于objective-c - NSMutableDictionary和新项目插入KVO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8168762/

10-13 03:52