Pozdrav,
Vec par dana razbijam glavu oko [self.tableView reloadData] koji kao da ne postoji. Ma sto pokusao, tabela je prazna. Sve to uzbudjenje desava se u Window-based aplikaciji sa Core Data (iphone). U delegat fajlu sam inicirao kontrollere:
`KindViewController *kindViewController = [[KindViewController alloc] initWithStyle:UITableViewStylePlain];
kindViewController.managedObjectContext = self.managedObjectContext;
UINavigationController *navKindViewController = [[[UINavigationController alloc]
initWithRootViewController:kindViewController] autorelease];
[kindViewController release];
[self.tabBarController setViewControllers:[NSArray arrayWithObjects:navKindViewController, nil]];
[self.window addSubview:self.tabBarController.view];
[self.window makeKeyAndVisible];`
Zatim sam u RootViewController fajlu implementirao:
- (id)initWithStyle:(UITableViewStyle)style
{
if ((self = [super initWithStyle:style]))
{
self.title = @"Product Category";
self.tabBarItem.image = [UIImage imageNamed:@"category.png"];
}
return self;
}
Tu su svi standardni Core Data i TableViewController metode i to sve radi, ubacim podatke o kategoriji produkta u bazu i oni se lepo prikazu u tabeli. Sada po kategoriji produkta moram izlistati produkte (kad selektiram red u tabeli ta selekcija mora voditi u drugi prozor sa tabelom u kojoj su produkti koji pripadaju selektiranoj kategoriji). Napravio sam child TableViewController fajl(class) i dodelio ga:
@class RootViewController;
i inicirao sa:
- (id)initWithRootController:(KindViewControlle *)aRootController category:(NSManagedObject *)aCategory
{
if ((self = [super init]))
{
self.rootController = aRootController;
self.category = aCategory;
}
return self;
}
viewWillAppear ima dodano [self.tableView reloadData], numberOfSections sadrzi return 1, numberOfRows ima
return [(NSSet *)[category valueForKey:@"products"] count]
i produkte sortiram:
- (NSArray *)sortProducts
{
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]
autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortNameDescriptor, nil];
return [[(NSSet *)[category valueForKey:@"products"] allObjects] sortedArrayUsingDescriptors:sortDescriptors];
}
a cellForRowAtIndexPath je standardno implementirana sa dodatim:
NSManagedObject *product = [[self sortProducts] objectAtIndex:indexPath.row]
Podaci o produktu ulaze u bazu, provjerio sam, tamo su ali nekako im se neda iz nje u tabelu. U bazi imam dva entiteta, Category i Product sa atributima koji su svi "optional" i "string", Category sadrzi property "products" koja je "one-to many", "optional" i Delete Rule "cascade" a Product ima property "category" koja je "to-one", "optional" i "Nullify" i "reverse" su jedna za drugu. Ma sta napravio tabela u mom ProductViewController prozory je prazna, xcode(4.0.2) ne javlja nikakva upozorenja niti greske, sve radi ali...u konzoli sam nekako uspio logirati ovo:
tableView: <UITableView: 0x859600>
dataSource: <ProductViewController: 0x1935f0>
delegate: <ProductViewController: 0x1935f0>
Za mene je prvi sumnjivac [self.tableView reloadData] u viewWillAppear, ali ni to nisam siguran. Ovo je za nekog ko vise zna od mene.
Hvala unaprijed!!
Znaci li ovo da TableView, dataSource i delegate nisu 0?
tableView: <UITableView: 0x859600>
dataSource: <ProductViewController: 0x1935f0>
delegate: <ProductViewController: 0x1935f0>
To samo znači da nisu nil, tj. alocirani su.
Znači inicijalno imaš popunjeni UITableView s podacima, ali ih izgubiš nakon sorta i reloadData?
Probao sam sa NSLog u numberOfSectionsInTableView, numberOfRowsInSection i cellForRowAtIndexPath i nijedan se nije ispisao u console, znaci te metode nikada nisu pozvane?
Ocito, da.
S obzirom da ti je projekt vjerojatno u ranoj fazi i da nema nista skakljivo unutra, bilo bi najpametnije da ga zazipas pa stavis negdje za skinut da pogledamo. Od ovog formatiranja koda na forumu mi oci krvare :/
OK, meilao kasno sinoc.
Nesto mislim, ima li CellIdentifier neke veze sa ovim problemom. Znam da kada se pravi custom cell onda identifier u IB mora odgovarati onom u cellForRowAtIndexPath. Ovdje je to sve programski, pa postoji li neko pravilo kako se imenuje?
Rijesio sam! U metodu koji mi salje podatke u bazu (insertProductWithCategory) falila mi je linija koda:
[product setValue:category forKey:@"category"];
gdje mi je "product" entity a "category" relationship.
Hvala svima jos jednom.