【问题标题】:making UIPickerView from core data objects从核心数据对象制作 UIPickerView
【发布时间】:2014-10-29 19:25:54
【问题描述】:

我有一个核心数据实体教师,我试图在 UIPickerVIew 中显示所有属性(名字、中间名、姓氏),所以我正在获取更多数据的对象:

- (NSArray *)takeTeacherForSubject {

    managedObjectContext = [AppDelegate sharedDelegate].managedObjectContext;

    NSFetchRequest *request = [[NSFetchRequest alloc]init];

    NSEntityDescription *description = [NSEntityDescription entityForName:@"Teacher" inManagedObjectContext: managedObjectContext]; [request setEntity:description];

    NSError *requestError = nil;

    teacherForSubjectArray = [[self.managedObjectContext executeFetchRequest:request error:&requestError] mutableCopy];

    if (requestError) { NSLog(@"%@" , [requestError localizedDescription]); } return teacherForSubjectArray; 
    }

来自 UIPickerDataSource 的方法:

- (NSInteger)numberOfComponentsInPickerView:
    (UIPickerView *)pickerView {
     return 1;
    }
- (int)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
        return [teacherForSubjectArray count];
    }

根据 NSManagedObjects 数组制作字符串的 NSMutableArray:

- (NSMutableArray *)makingDict {

    int count = [teacherForSubjectArray count];
    teacherStringsArray = [NSMutableArray arrayWithCapacity:count];
    for (Teacher* object in teacherForSubjectArray)
    {
        teacher = [NSString stringWithFormat:@"%@ %@ %@", object.firstName, object.middleName, object.lastName];
        [teacherStringsArray addObject:teacher];
    }
    NSLog(@"%@", teacherStringsArray);
    return teacherStringsArray;
}

制作 NSArray 并展示它:

    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ NSArray
*array = [NSArray arrayWithArray:teacherStringsArray]; return [array objectAtIndex:row];
        }

但没有任何内容进入屏幕。有什么问题?也许有人知道更好的方法?

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    您的teacherForSubjectArray 中已经有教师对象,不需要方法makingDict 或在titleForRow 中创建新数组。您只需要从 titleForRow 中的教师对象中提取数据,

    -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ NSArray
        Teacher *teacher = teacherForSubjectArray[row];
        NSString *teacherName = [NSString stringWithFormat:@"%@ %@ %@", teacher.firstName, teacher.middleName, teacher.lastName];
        return teacherName;
    }
    

    顺便说一句,您可以使用一行代码而不是三行代码来创建您的请求(我看到很多人使用这三行代码,不知道为什么)。而不是这个,

    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSEntityDescription *description = [NSEntityDescription entityForName:@"Teacher" inManagedObjectContext: managedObjectContext]; 
    [request setEntity:description];
    

    你可以用这个,

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Teacher"];
    

    【讨论】:

    • 我不知道为什么,但我尝试做同样的事情,但没有奏效,所以我确实喜欢这个,有点疯狂。感谢您的解释,它有很大帮助!
    【解决方案2】:

    乍一看,您的代码似乎是准确的。

    您是否检查过代码确实被调用了?尝试在 numberOfComponentsInPickerView: 中添加 NSLog 语句,以确保实际调用了该方法。如果不是,那么您需要设置delegatedelegatedataSource,以便它知道从哪里获取信息。

    [myPickerView setDelegate:self];
    [myPickerView setDataSource:self];
    

    如果您没有设置这些,则不会调用委托方法,UIPickerView 将显示为空白/空。

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多