2010-02-27 6 views
1

J'essaye de charger mes données dans ma vue détaillée. Quelqu'un peut-il jeter un coup d'oeil et voir pourquoi il ne montre pas? Il charge bien dans mon rootviewcontroller, mais pas dans la vue détaillée.Les données ne se chargent pas dans la vue détaillée

DetailViewController.m

#import "DetailViewController.h" 


@implementation DetailViewController 




- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview 
    // Release anything that's not essential, such as cached data 
} 



- (void)setIcon:(UIImage *)newIcon 
{ 
    [super setIcon:newIcon]; 
    iconView.image = newIcon; 
} 

- (void)setPublisher:(NSString *)newPublisher 
{ 
    [super setPublisher:newPublisher]; 
    publisherLabel.text = newPublisher; 
} 


- (void)setName:(NSString *)newName 
{ 
    [super setName:newName]; 
    nameLabel.text = newName; 
} 



- (void)dealloc 
{ 
    [iconView release]; 
    [publisherLabel release]; 
    [nameLabel release]; 
    [priceLabel release]; 

    [super dealloc]; 
} 


@end 

detailviewcontroller.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 




@interface DetailViewController : UIViewController { 
    IBOutlet UIImageView *iconView; 
    IBOutlet UILabel *publisherLabel; 
    IBOutlet UILabel *nameLabel; 
    IBOutlet UILabel *priceLabel; 

} 




@end 

RootViewControllerPoints.m

#import "RootViewControllerPoints.h" 
#import "DetailViewController.h" 




#define USE_INDIVIDUAL_SUBVIEWS_CELL 1 

#define DARK_BACKGROUND [UIColor colorWithRed:151.0/255.0 green:152.0/255.0 blue:155.0/255.0 alpha:1.0] 
#define LIGHT_BACKGROUND [UIColor colorWithRed:172.0/255.0 green:173.0/255.0 blue:175.0/255.0 alpha:1.0] 


@implementation RootViewController 

@synthesize tmpCell, data; 


#pragma mark View controller methods 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Configure the table view. 
    self.tableView.rowHeight = 73.0; 
    self.tableView.backgroundColor = DARK_BACKGROUND; 
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

    // Load the data. 
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; 
    self.data = [NSArray arrayWithContentsOfFile:dataPath]; 
} 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    switch (toInterfaceOrientation) { 
     case UIInterfaceOrientationPortrait: 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationLandscapeRight: 
      return YES; 
     default: 
      return NO; 
    } 
} 



#pragma mark Table view methods 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [data count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"ApplicationCell"; 

    ApplicationCell *cell = (ApplicationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 

#if USE_INDIVIDUAL_SUBVIEWS_CELL 
     [[NSBundle mainBundle] loadNibNamed:@"IndividualSubviewsBasedApplicationCell" owner:self options:nil]; 
     cell = tmpCell; 
     self.tmpCell = nil; 

#endif 
    } 

    // Display dark and light background in alternate rows -- see tableView:willDisplayCell:forRowAtIndexPath:. 
    cell.useDarkBackground = (indexPath.row % 2 == 0); 

    // Configure the data for the cell. 

    NSDictionary *dataItem = [data objectAtIndex:indexPath.row]; 
    cell.icon = [UIImage imageNamed:[dataItem objectForKey:@"Icon"]]; 
    cell.publisher = [dataItem objectForKey:@"Publisher"]; 
    cell.name = [dataItem objectForKey:@"Name"]; 


    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    return cell; 
} 



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil]; 
    detailViewController. = [data objectAtIndex:indexPath.row]; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    [detailViewController release]; 
} 



@end 

Cela a été mise sur écoute-moi pendant un certain temps, je l'ai regardé de nombreux exemples, tutoriels et même demandé à d'autres développeurs d'iphone. Toute source semble dire quelque chose de différent.

+0

Ajouter l'iPhone comme balise. Vous obtiendrez plus de réponses alors. – Emil

+0

Quelle est la ligne "detailViewController. = [Data objectAtIndex: indexPath.row];" dans didSelectRowAtIndexPath censé faire? Est-ce le code réel ou une faute de frappe dans votre question? Pourquoi y a-t-il un point après detailViewController? – DyingCactus

+0

ah, c'était une ligne de code suggérée par un autre utilisateur. Bien qu'il soit tapé comme ça, le débogueur le prend comme une erreur. Si je le supprime tout se charge bien, mais les données ne sont pas non plus transmises à la sous-vue. – user278342

Répondre

1

Le premier problème est que les méthodes setXXX dans DetailViewController tentent de faire des appels à super setXXX mais comme DetailViewController est une sous-classe de UIViewController ces appels à super échoueront car UIViewController n'a pas de telles méthodes. Supprimez les appels à super dans les méthodes setXXX.

Le deuxième problème est que les méthodes setXXX définissent les contrôles directement sur DetailViewController mais les contrôles ne seront pas accessibles tant que la vue ne sera pas chargée, donc elle ne fonctionnera pas si les méthodes sont appelées avant l'appel pushViewController.

Si vous modifiez le code dans didSelectRowAtIndexPath comme suit il devrait fonctionner:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil]; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    [detailViewController setName:@"name here"]; 
    [detailViewController setPublisher:@"publisher here"]; 
    [detailViewController setIcon:yourImageVariableHere];  
    [detailViewController release]; 
} 

Bien que le changement ci-dessus devrait fonctionner, vous voudrez peut-être envisager de créer Ivars pour maintenir les valeurs DetailViewController (au lieu d'utiliser l'interface se contrôle pour conserver les données). Créez ensuite des propriétés pour eux en utilisant @property et @synthesize. Les propriétés peuvent être définies immédiatement après la création de DetailViewController et dans viewDidLoad de la vue, vous pouvez définir les contrôles ui sur les valeurs de propriété. Cela donnera au contrôleur DetailViewController plus de contrôle sur la façon dont son interface utilisateur est mise à jour, vous permettra de modifier l'interface utilisateur sans affecter les appelants, et il n'a pas besoin d'être affiché pour définir ses propriétés.

Questions connexes