Chcę bez użycia cocoa bindings i array controller'a móc sortować NSTableView.
Mój model to :
NSMutableArray *list;
Obiektami w tablicy są NSString'i.
w IB mam NSTableView, ustawiłem jego delegat i datasource na utworzoną przeze mnie klasę ListController. W ListControlerze zaimplementowałem metody:
Kod:
//dodawanie do tablicy
- (IBAction)addNewItem:(id)sender{
NSString *str= [newItem stringValue];
if (![str isEqualToString:@""]){
[list addObject:str];
[itemsTable reloadData];
}
}
/*** NSTableViewDataSource ***/
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
return[list count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
return[list objectAtIndex:row];
}
//??????????????????????????????????????????????????????????????
- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors{
NSLog(@"(void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors");
}
/*** NSTableViewDelegate ***/
- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
if (![object isEqualToString:@""]) {
[list replaceObjectAtIndex:row withObject:object];
}
else {
[list removeObjectAtIndex:row];
[itemsTable reloadData];
}
}
Działa mi dodawanie, usuwanie i edycja wierszy w NSTableView.
Nie działa mi sortowanie, na początku funkcja:
Kod:
- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
nie była wywoływana. Problem rozwiązałem, poprzez dodanie do NSTableView, NSSortDescriptor'a:
Kod:
//to na pewno jest źle :)
NSTableColumn *column = [[itemsTable tableColumns] objectAtIndex:0];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] init];
[column setSortDescriptorPrototype:sortDescriptor];
I teraz pytanie za 100pkt:
Jeżeli miałbym klasę a w niej jakieś properties, np lastName, to utworzyłbym NSSortDescriptor'a w taki oto sposób:
Kod:
lastNameDescriptor = [[NSSortDescriptor alloc]
initWithKey:@"lastName"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)];
ALE, mój model nie posiada klasy z properties np lastName. Umieszczone w nim mam po prostu NSStringi.
I tu pojawia się problem co wstawić zamiast initWithKey:@"lastName".
Do tego jak zaimpelmentować "- (void)tableView
NSTableView *)aTableView sortDescriptorsDidChange
NSArray *)oldDescriptors"
żeby sortować moją tablicę stringów raz rosnąco i raz malejąco.
Projekt można pobrać z tutaj : http://student.agh.edu.pl/~nagrodz/Katalog/ToDoList.zip