全く新しくない
色々試してるが、内容は全く新しくない。
コアデータの永続オブジェクトにNSArray(NSString)を使用する。
ベタで書こうとしたけど長過ぎるのでgistで。
コアデータの永続オブジェクトにNSArray(NSString)を使用する
NSTokenFieldの補完データをコアデータで管理する。
せっかくコアデータを使ってるんだから、NSTokenFieldの補完用データをコアデータで管理してみた。
NSTokenFieldの補完データをコアデータで管理する。
#pragma mark#### NSTokenField Delegate #### - (NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex { NSManagedObjectContext *moc = [appDelegate managedObjectContext]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", substring]; NSEntityDescription *entry = [NSEntityDescription entityForName:@"VoiceActor" inManagedObjectContext:moc]; NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease]; [fetch setEntity:entry]; [fetch setPredicate:predicate]; NSError *error = nil; NSArray *objects = [moc executeFetchRequest:fetch error:&error]; if(!objects) { if(error) { NSLog(@"fail fetch reason -> %@", error); } } NSMutableArray *result = [NSMutableArray array]; for(id obj in objects) { [result addObject:[obj valueForKey:@"name"]]; } return result; } - (void)registerVoiceActor:(NSTokenField *)tokenField { id array = [tokenField objectValue]; if(![array isKindOfClass:[NSArray class]]) return; NSManagedObjectContext *moc = [appDelegate managedObjectContext]; NSEntityDescription *entry = [NSEntityDescription entityForName:@"VoiceActor" inManagedObjectContext:moc]; NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease]; [fetch setEntity:entry]; for(id token in array) { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@", token]; [fetch setPredicate:predicate]; NSError *error = nil; NSUInteger count = [moc countForFetchRequest:fetch error:&error]; if(error) { NSLog(@"fail fetch reason -> %@", error); continue; } if(count == 0) { id obj = [NSEntityDescription insertNewObjectForEntityForName:@"VoiceActor" inManagedObjectContext:moc]; [obj setValue:token forKey:@"name"]; } } } - (BOOL)control:(id)control textShouldEndEditing:(NSText *)fieldEditor { if([control tag] == 2000) { [self registerVoiceActor:control]; } return YES; }