IOS:从uipicker

时间:2016-04-24 20:15:00

标签: ios core-data nsarray uipickerview

我正在尝试让UIPickerController显示一些用户。如果我按如下方式对一些示例用户进行硬编码,它的工作原理就足够了:

  //in viewDidLoad
       _users = @[@"Ronald", @"David",
                          @"Sharon", @"Amir", @"Atul"]; //etc.

但是,我想从核心数据中提取这些用户。到目前为止,我已经尝试了一个简单的提取和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 个答案:

答案 0 :(得分:1)

两个建议伙伴:)

  1. 如果你声明了一个名为doers的属性(你应该从你的getter声明中假设:) :)声明它是NSArray类型而不是id:)
  2. 2.更改你的getter for doers返回一个数组而不是id :)。返回一个Array并将返回类型声明为id并最终将其重新转换为数组以使用下标语法访问其实体没有任何意义:)

    您的代码中的问题

    _doers是一个实例变量:) self.doers是一个属性:)

    当您使用@synchronize同步属性时(现在您不再编写它,因为xcode默认为您写了一个)实例变量与属性具有相同的名称但前缀为下划线用于提供默认的setter并吸引你的财产:)

    当您调用_doers时,您正在访问实例变量而不是属性,因此永远不会调用您的getter:)

    如何解决?

    而不是回复_doers[row];来电self.doers[row]

    会解决问题吗?

    没有:)。它返回一个用户实体对象数组:)而不是字符串数组:)所以如果你只是说self.doers[row],你会将一个User(在你的情况下是Dictionary)的对象返回给一个接受字符串的方法:)< / p>

    那么正确的方法是什么?

    - (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中执行一次fetch,并为你的选择器使用它的feched objects数组:)< / p>

    否则

    将doers of doers中的代码移动到方法中调用一次并填充您的属性一次,填充后使用该属性填充选择器:)

    Coredata的运作成本很高:)

    无论如何快乐编码,一切顺利:)

    声明:上面提供的代码仅用于解释概念,而不是用于复制粘贴的目的:)在盲目使用之前检查语法:)