【发布时间】:2018-06-12 10:39:15
【问题描述】:
首先我想指出的是,关于堆栈溢出的这个主题有很多问题,但没有任何帮助。我也尝试向这些所有者寻求建议,但无法与他们中的任何一个取得联系。
这是我的场景。我从一个对象数组的 API 接收数据。这些对象都是相同的结构,但它们会从 API 端点动态变化。当我制作了一个 NSDictionary 的 NSArray 并尝试使用提供的数组的值设置我的网格数据源时。它没有用。当我查看文档 IGGridViewDataSourceHelper 时,我发现了以下信息“截至目前,数据必须是 NSObject 的派生并且至少具有一个属性”。所以我开始思考一种在运行时创建 NSObject 的方法。我能够在 Apple Developers 文档中找到一些资源来实现这一点。
假设变量字典是在函数中给出的
请检查以下内容
- (NSArray *)getRecrodsFromDictionary: (NSDictionary*)dictionary {
// the following include the array that I want to turn into objects
NSArray * response = [self parseKey:@"responseDetails" fromDictionary:dictionary];
NSMutableArray * rows = [[NSMutableArray alloc] init];
if ([response count] != 0) {
// 1. get all NSDictionary keys
NSDictionary * temp = response[0];
NSArray * keys = [temp allKeys];
// 2. create a class
Class ModelClass = objc_allocateClassPair([NSObject class], "WidgetDetailsModel", 0);
// 3. all class variables with the same name as key retrieved from NSDictionary
for (NSString * key in keys) {
NSString * currkey = [key capitalizedString];
const char * name = [currkey UTF8String];
class_addIvar(ModelClass, name, sizeof(id), rint(log2(sizeof(id))), @encode(NSString));
}
// 4. register a class to be used
objc_registerClassPair(ModelClass);
for (NSDictionary * curr in response) {
// create object
id MC = [[ModelClass alloc] init];
for (NSString * key in keys) {
// set values
const char * name = [key cStringUsingEncoding:NSASCIIStringEncoding];
Ivar CurrVar = class_getInstanceVariable(ModelClass, name);
NSString * newValue = [curr objectForKey: key];
object_setIvar(MC, CurrVar, newValue);
}
// add object to array
[rows addObject:MC];
}
}
return [rows copy];
}
一旦我获得返回值并尝试将其设置为数据源数据变量,我会收到以下运行时错误。
[valueForUndefinedKey:]:该类不符合键 AssetsClass 的键值编码。
我找不到任何关于如何使在运行时创建的 NSObject 键值编码兼容的信息。如何使其符合键值编码?
编辑 1: 我设法通过使字段名称大写来绕过运行时错误。 现在该表正在填充空数据(与数据的行数相同,但其中的文本为空),这是正确的事情,因为 iVar 的值没有保留。我怎样才能保留它?
编辑 2: 我仍然无法保留 iVar 值,因此我将函数的位置更改为相同的 UIView 类,然后它确实在短时间内保留了它,我不得不设置网格数据源数据值。 我很想知道是否有办法使 iVar 保留或将其属性之一设置为 strong/retain 以将其标记为释放过程。
【问题讨论】:
标签: ios objective-c