【问题标题】:How to populate a UIPickerView with results from a NSFetchRequest using Core Data如何使用 Core Data 使用 NSFetchRequest 的结果填充 UIPickerView
【发布时间】:2015-05-19 04:49:19
【问题描述】:

我有一个 UIPickerView,我正在尝试使用 NSFetchRequest 从 managedObjectContext 提取数据的结果填充它。当我使用以下内容初始化我的 UIPickerView 时,KCModalPickerView *pickerView = [[KCModalPickerView alloc] initWithValues:_userNames]; Xcode 不会抛出警告或错误,但是当我构建并运行应用程序时,我会收到以下错误。

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[Account copyWithZone:]:无法识别的选择器已发送到实例 0x7a60ec70” * 首先抛出调用栈:

现在在你说这个错误是由于我没有在我的 vc 中实现 copyWithZone 方法之前,我想指出我在我的类文件中没有使用关键字 copy

我被告知导致崩溃的方法属于KCModalPicker 类实现文件。该方法如下所示,

// 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]; 

【问题讨论】:

  • _usernames 指向什么?

标签: ios objective-c core-data xcode6 uipickerview


【解决方案1】:

KCModalPickerView 需要 NSString 的数组,你给它一个 Account 的数组。该框架试图复制您的实例,因为它认为它是一个NSString,它符合NSCopying 协议并实现copyWithZone:。您的对象没有,并且会有[Account copyWithZone:]: unrecognized selector sent to instance 异常。

使用您的核心数据对象中的适当属性简单地创建一个 NSStrings 数组。

可能有更聪明的方法,但这是显而易见的解决方案:

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: 返回一个字典数组。而且您应该能够使用NSArray *names = [_usernames valueForKey:@"username"]; 而不是for 循环。

【讨论】:

  • 非常感谢您的详尽回答。这是我这几天一直在努力解决的问题。 :-?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2012-01-05
  • 1970-01-01
  • 2011-04-15
相关资源
最近更新 更多