【问题标题】:How to add object of NSDictionary type to an NSMutableArray which contains objects of NSDictionaryResultType?如何将 NSDictionary 类型的对象添加到包含 NSDictionaryResultType 对象的 NSMutableArray?
【发布时间】:2014-02-01 10:45:52
【问题描述】:

我正在使用以下代码从 Core Data 获取数据-

NSManagedObjectContext *context=[[self appDelegate] managedObjectContext];

NSEntityDescription *entityDesc=[NSEntityDescription entityForName:@"Messages" inManagedObjectContext:context];
NSFetchRequest *request=[[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
[request setResultType:NSDictionaryResultType];
NSArray *objects=[context executeFetchRequest:request error:&error];

包含上述代码的函数返回给我 NSDictionaryType 的 NSArray。 在视图控制器上,我将它们存储到 NSMutableArray *messages on viewdidload 函数中。 现在,如果收到或发送新消息,我想将该新的 NSDictionary 存储到消息中。这样做会产生错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x9740230”

获取数据的代码-

CoreDataHandler *handler=[[CoreDataHandler alloc] init];

NSMutableArray *messages=[[NSMutableArray alloc]initWithObjects: nil];
messages=(NSMutableArray *)[handler fetchMessages:[chatWithUser objectForKey:@"jidStr"]];

我将对象添加到消息的代码-

NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
[m setObject:messageStr forKey:@"msg"];
[m setObject:@"you" forKey:@"sender"];
[m setObject:[NSString getCurrentTime] forKey:@"createdAt"];
[messages addObject:(NSDictionary *) m];

【问题讨论】:

  • 看起来您正在尝试在 NSArray 而不是 NSMutableArray 上调用“addObject:”,请在您将对象添加到数组的位置发布相关代码。
  • 您不能将对象添加到非可变数组中。
  • 如果你在一行中初始化一个指针,然后在下一行将指针设置为不同的值,那么第一行就没什么用了。

标签: ios objective-c ios7


【解决方案1】:

你应该在 NSArray 上使用 NSMutableArray,NSArray 不包含方法 addObject。 您可以创建可变副本,例如:

NSMutableArray *objects=[[context executeFetchRequest:request error:&error] mutableCopy;

现在您可以随意调用该对象的 addObject 方法了。

【讨论】:

    【解决方案2】:

    仅仅因为你将狗声明为猫,并不意味着它会突然“miau”。它仍然是一只狗,只是穿着猫的衣服。现在严肃地说。 问题是您试图将事物放入不可变的 NSArray 中。一旦创建了不可变数组,就无法更改其内容。

    你可以试试这个

    NSMutableArray *objects=[[context executeFetchRequest:request error:&error] mutable copy];
    

    【讨论】:

    • 好的,谢谢。我了解问题并成功纠正。
    【解决方案3】:

    您能否提供您在此处引用的其他代码? (例如,您说您将从上述 fetch 获得的消息存储到 NSMutableArray 中。显示声明可变数组的代码、实例化的代码以及添加 fetch 结果的代码)。 从错误消息来看,您正在尝试将对象添加到 NSArray,而不是 NSMutableArray。

    【讨论】:

      【解决方案4】:

      您能否提供您在此处引用的其他代码? (例如,您说您将从上述 fetch 获得的消息存储到 NSMutableArray 中。显示声明可变数组的代码、实例化的代码以及添加 fetch 结果的代码)。 从错误消息来看,您正在尝试将对象添加到 NSArray,而不是 NSMutableArray。

      好的,所以您正在创建一个 NSMutableArray 并将其指针存储在“消息”中。但是随后您为“消息”分配了一个不同的指针。您将非可变结果集分配给它。 你不应该那样做。取而代之的是,只需将 fetch 中的对象添加到消息对象中。 类似 [messages addObjectsFromArray: fetchresults];

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        • 2014-05-25
        相关资源
        最近更新 更多