My question is relevant to this one posted on StackOverflow.
In iOS, NSFetchedResultController has section parameter which can get data from Core Data when an attribute is set as section sectionNameKeyPath: while fetching attributes.
In Cocoa, NSTableView use Floating Group Rows to show section. My managed object model contains two entity.
Entity 1
Entity: Author
Attribute: name
Entity 2
Entity: Book
Attribute: title
Relationship booksByAuthor is ToMany.
I want to show Author name in NSTable floating group row followed by Book titles by them in the row below.
To set group cell, I am using following tableView delegate methods
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;
-(BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row;
-(CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row;
I am setting table view data using NSArrayController.
I searched for tutorials for this but there is not much available for Cocoa. I am new it so bear with me. I am stuck at this, could anyone help me on this. Do I need to alter my model object.
Edit 1
I tried this approach but the result is jumbled
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
NSArray *bookTitleArray = [[self.bookArrayController arrangedObjects]valueForKey:@"title"];
NSArray *fromAuthorArray = [[self.bookArrayController arrangedObjects]valueForKey:@"fromAuthor"];
Author *authorName = fromAuthorArray[row];
NSMutableArray *testArray = [[NSMutableArray alloc]init];
for (Author *auth in fromAuthorArray) {
[testArray addObject:auth];
for (Book *book in auth.books) {
if (book.fromAuthor.name == auth.name) {
[testArray addObject:book.title];
}
}
}
if ([testArray[row]isKindOfClass:[Author class]] ){
NSTableCellView *newCell = [tableView makeViewWithIdentifier:@"authorCell" owner:self];
[newCell.textField setStringValue:authorName.name];
return newCell;
}else if (![testArray[row]isKindOfClass:[Book class]]){
NSTableCellView *cellView = [tableView makeViewWithIdentifier:@"titleCell" owner:self];
[cellView.textField setStringValue:bookTitleArray[row]];
return cellView;
}
return nil;
}
-(BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row{
NSArray *fromAuthorArray = [[self.bookArrayController arrangedObjects]valueForKey:@"fromAuthor"];
NSMutableArray *testArray = [[NSMutableArray alloc]init];
for (Author *auth in fromAuthorArray) {
[testArray addObject:auth];
for (Book *book in auth.books) {
if (book.fromAuthor.name == auth.name) {
[testArray addObject:book.title];
}
}
}
if ([testArray[row]isKindOfClass:[Author class]]) {
return YES;
}else if ([testArray[row]isKindOfClass:[Book class]]){
return NO;
}
return NO;
}
Result: