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 的核心数据中获取数组的主要内容,如果未能解决你的问题,请参考以下文章

iOS:核心数据获取

iOS - 将 JSON 对象转换为有序数组

UIPicker 视图不显示来自 JSON 数组的数据

从单个 UIPicker 获取两个标签的值

从 UIPicker 进行选择时尝试显示图像和标签

UIPicker 从 NSUserDefaults 中选择双值