如何使用 Core Data 使用 NSFetchRequest 的结果填充 UIPickerView
How to populate a UIPickerView with results from a NSFetchRequest using Core Data
我有一个 UIPickerView,我正在尝试用 NSFetchRequest 从 managedObjectContext 中提取数据的结果填充它。当我用以下内容初始化我的 UIPickerView 时,KCModalPickerView *pickerView = [[KCModalPickerView alloc] initWithValues:_userNames];
Xcode 不会抛出警告或错误,但是当我构建和 运行 应用程序时,我收到以下错误。
* 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[Account copyWithZone:]: 无法识别的选择器发送到实例 0x7a60ec70'
* 首先抛出调用堆栈:
现在,在你说这个错误是由于我没有在我的 vc 中实现 copyWithZone
方法之前,我想指出我的 class 文件中没有任何地方使用关键字 copy
我被告知导致崩溃的方法属于 KCModalPicker
class 实现文件。该方法如下所示,
// edit this method
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [self.values objectAtIndex:row];
}
我需要更改/编辑/添加什么以防止此应用程序崩溃?
更新
_usernames 是一个 NSArray ...结果如下所示,
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:_managedObjectContext];
[fetchRequest setEntity:entity];
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"username"]];
NSError *error = nil;
NSArray _usernames = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
KCModalPickerView
需要一个 NSString
的数组,你给它一个 Account
的数组。该框架试图复制您的实例,因为它认为它是一个 NSString
,符合 NSCopying
协议并实现 copyWithZone:
。您的对象没有,并且会出现 [Account copyWithZone:]: unrecognized selector sent to instance
异常。
使用 Core Data 对象中的适当属性简单地创建一个 NSString 数组。
可能有更聪明的方法,但这是显而易见的解决方案:
NSMutableArray *names = [NSMutableArray arrayWithCapacity:[_usernames count]];
for (Account *account in _usernames) {
NSString *accountName = account.name;
if (!accountName) {
accountName = @"<Unknown Account>";
}
[names addObject:accountName];
}
KCModalPickerView *pickerView = [[KCModalPickerView alloc] initWithValues:names];
刚看到你设置了propertiesToFetch
。此外,您必须将 fetchRequest 的 resultsType
设置为 NSDictionaryResultType
。在本例中 executeFetchRequest:error:
returns 字典数组。你应该能够使用 NSArray *names = [_usernames valueForKey:@"username"];
而不是 for 循环。
我有一个 UIPickerView,我正在尝试用 NSFetchRequest 从 managedObjectContext 中提取数据的结果填充它。当我用以下内容初始化我的 UIPickerView 时,KCModalPickerView *pickerView = [[KCModalPickerView alloc] initWithValues:_userNames];
Xcode 不会抛出警告或错误,但是当我构建和 运行 应用程序时,我收到以下错误。
* 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[Account copyWithZone:]: 无法识别的选择器发送到实例 0x7a60ec70' * 首先抛出调用堆栈:
现在,在你说这个错误是由于我没有在我的 vc 中实现 copyWithZone
方法之前,我想指出我的 class 文件中没有任何地方使用关键字 copy
我被告知导致崩溃的方法属于 KCModalPicker
class 实现文件。该方法如下所示,
// edit this method
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [self.values objectAtIndex:row];
}
我需要更改/编辑/添加什么以防止此应用程序崩溃?
更新
_usernames 是一个 NSArray ...结果如下所示,
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:_managedObjectContext];
[fetchRequest setEntity:entity];
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"username"]];
NSError *error = nil;
NSArray _usernames = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
KCModalPickerView
需要一个 NSString
的数组,你给它一个 Account
的数组。该框架试图复制您的实例,因为它认为它是一个 NSString
,符合 NSCopying
协议并实现 copyWithZone:
。您的对象没有,并且会出现 [Account copyWithZone:]: unrecognized selector sent to instance
异常。
使用 Core Data 对象中的适当属性简单地创建一个 NSString 数组。
可能有更聪明的方法,但这是显而易见的解决方案:
NSMutableArray *names = [NSMutableArray arrayWithCapacity:[_usernames count]];
for (Account *account in _usernames) {
NSString *accountName = account.name;
if (!accountName) {
accountName = @"<Unknown Account>";
}
[names addObject:accountName];
}
KCModalPickerView *pickerView = [[KCModalPickerView alloc] initWithValues:names];
刚看到你设置了propertiesToFetch
。此外,您必须将 fetchRequest 的 resultsType
设置为 NSDictionaryResultType
。在本例中 executeFetchRequest:error:
returns 字典数组。你应该能够使用 NSArray *names = [_usernames valueForKey:@"username"];
而不是 for 循环。