IOS:从 uipicker 的核心数据中获取数组
Posted
技术标签:
【中文标题】IOS:从 uipicker 的核心数据中获取数组【英文标题】:IOS: fetch array from core data for uipicker 【发布时间】:2016-04-24 20:14:59 【问题描述】:我正在尝试让 UIPickerController 显示一些用户。如果我对一些示例用户进行硬编码,如下所示:
//in viewDidLoad
_users = @[@"Ronald", @"David",
@"Sharon", @"Amir", @"Atul"]; //etc.
但是,我想从核心数据中提取这些用户。到目前为止,我已经尝试了一个简单的 fetch 和 nsfetchedresults 控制器,但似乎没有任何效果。从核心数据中获取数组的首选方式是什么。
//fetchrequest
- (id) getUsers
NSFetchRequest *fetchRequest = [NSFetchRequest
fetchRequestWithEntityName:@"User"];
fetchRequest.resultType = NSDictionaryResultType;
NSError *error = nil;
self.managedObjectContext = [chModel sharedInstance].managedObjectContext;
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest
error:&error];
return results;
//this throws an error at
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row
forComponent:(NSInteger)component
NSLog(@"in titleforrow");
return _users[row];//error here. also error if I substitute [0]
//when I try
_users = [self.fetchedResultsController fetchedObjects];
frc 永远不会被调用
【问题讨论】:
用有关实际错误的详细信息更新您的问题。 【参考方案1】:哥们有两个建议:)
-
如果你声明了一个名为 doers 的属性(你应该从你的 getter 声明中假设它:))声明它是 NSArray 类型而不是 id :)
2.更改你的 getter 以返回一个数组而不是 id :)。返回一个数组并将返回类型声明为 id 然后最终将其重新转换为数组以使用下标语法访问其实体是没有任何意义的:)
代码中的问题
_doers 是一个实例变量 :) self.doers 是一个属性 :)
当您使用 @synchronize 同步您的属性时(现在您不再编写它,因为 xcode 默认为您编写一个)与属性同名但前缀为下划线的实例变量用于提供默认设置器并获取您的财产:)
当您调用 _doers 时,您访问的是实例变量而不是属性,因此永远不会调用您的 getter :)
如何解决??
而不是调用 return _doers[row];
调用 self.doers[row]
能解决问题吗?
不 :)。它返回一个用户实体对象数组:)而不是字符串数组:)所以如果你简单地说self.doers[row]
你将返回一个用户对象(在你的情况下是字典)到一个接受字符串的方法:)
那么正确的方法是什么??
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row
forComponent:(NSInteger)component
User *userInstance = (User *)self.doers[row];
return userInstance.name; //user entiy attribute which holds name or something like that
或
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row
forComponent:(NSInteger)component
return [self.doers[row] valueForKey:@"name"] //user entiy attribute which holds name or something like that
它会工作 :) 虽然使用 getter 的属性很差模型 :)
这种方法正确吗?
它会起作用吗?当然! ...这是正确的方法吗?没门! :)
对于选择器中的每一行,都会调用此方法,因为您正在访问属性 self.doers,它为每个单元格调用它的 getter :) 这意味着您将查询核心数据的很多次 :)
我认为它是不必要的 :) 您可以做的是让用户 NSFetchedResultsController
一个单调变量根据您的要求在 viewdidload 或 viewwillappear 中执行一次提取,并将其提取的对象数组用于您的选择器:)
其他
将执行者 getter 中的代码移动到方法调用一次并填充您的属性一次,一旦填充,使用该属性填充选择器:)
Coredata 操作成本高昂 :)
无论如何编码愉快,一切顺利:)
声明:上面提供的代码仅用于解释概念,而不是用于复制粘贴:)在盲目使用之前检查语法:)
【讨论】:
以上是关于IOS:从 uipicker 的核心数据中获取数组的主要内容,如果未能解决你的问题,请参考以下文章