如何使用 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 循环。