2010-12-14 70 views
1

J'ai cette tableview dans mon application qui a un nom d'article particulier tel que "Apple". Lorsque l'utilisateur appuie sur l'élément sélectionné, il est dirigé vers un détail qui affiche une image et une description de l'élément sélectionné. Je pensais utiliser des plistas pour le faire, mais je ne sais pas comment faire. Aidez-moi, s'il vous plaît.Utilisation de plist dans un détailVoir

J'ai regardé certaines sources telles que iCodeBlog mais elles n'expliquent pas vraiment comment récupérer et enregistrer si bien. Peut-être que vous pouvez aussi faire référence à des liens qui décrivent mieux cela.

Heres une plist que j'ai essayé. Chacun des éléments (Orange, Apple) contient les données que je veux afficher dans mon détail. Je veux essentiellement afficher les données affichées.

alt text

+0

Pouvez-vous fournir plus d'informations? Que voulez-vous dire en utilisant des plits pour le faire? – ughoavgfhw

+0

Juste remarqué une faute de frappe dans mon dernier commentaire. Je voulais dire des plistes, pas des plis. – ughoavgfhw

+0

je vais modifier ma question. – Souljacker

Répondre

2

Voici un exemple de contrôleur de vue qui fera ce que vous voulez. J'ai nommé la classe DetailViewController et chargé le plist de Details.plist dans les ressources de l'application. Les images sont également situées dans les ressources de l'application.

DetailViewController.h

#import <UIKit/UIKit.h> 
@interface DetailViewController : UIViewController { 
    UILabel *description; 
    UIImageView *imageView; 
    NSString *selectedItem; 
} 
@property (nonatomic, retain) IBOutlet UILabel *description; 
@property (nonatomic, retain) IBOutlet UIImageView *imageView; 
@property (nonatomic, copy) NSString *selectedItem; 
@end 

DetailViewController.m

#import "DetailViewController.h" 
@implementation DetailViewController 
@synthesize description, imageView, selectedItem; 

- (void)viewDidLoad { 
    NSDictionary *details = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Details" ofType:@"plist"]]; 
    details = [details objectForKey:self.selectedItem]; 
    self.description.text = [details objectForKey:@"description"]; 
    self.imageView.image = [UIImage imageNamed:[details objectForKey:@"image"]]; 
} 
@end 

Ensuite, tout ce que vous devez faire est de mettre à jour la propriété selectedItem avant de charger la vue et créer un fichier NIB avec l'étiquette de description et voir l'image attachée à leurs points de vente.

+0

Comment puis-je mettre à jour exactement la propriété selectedItem? – Souljacker

+0

merci, c'était assez simple – Souljacker

0

créer un tableau dans un plist avec un certain nombre d'éléments qui est égal au nombre de lignes. Créez une chaîne appelée description et une chaîne appelée image dans chaque élément. Obtenez le numéro de la ligne sélectionnée dans la méthode didSelectRowAtIndex:. Conservez le dictionnaire dans un NSDictionary

[myDictionary initWithDictionary:[myArray objectAtIndex:indexPath.row]]

ensuite obtenir le imagestring et la chaîne de description en appelant

[myDictionary objectForKey:@"image"]

et passer ces chaînes à la vue détaillée.

1

Passez un NSString à la vue détaillée et chargez l'élément en fonction de NSString. Il peut s'agir d'un nom de dictionnaire ou d'un élément particulier d'un tableau.

newDetailViewController.currentItem = @"Array1"; 

et à mon avis de détail, définir:

.h 
    NSString *currentItem; 
    @property(nonatomic,retain) NSString *currentItem; 
.m 
    @synthesize currentItem; 

Maintenant currentItem dans votre contrôleur DetailView sera "Array1", puisque c'est ce que nous a été transmis.

Tout dépend vraiment de la configuration de votre plist, utilisez-vous un NSArray, un NSDictionary?

Il y a beaucoup de façons dont vous pouvez mettre cela à utiliser:

NSString *current = [NSString stringWithFormat:@"%@/%@",appDocsPath,currentItem]; 
    NSMutableDictionary* dict = [[[NSMutableDictionary alloc] initWithContentsOfFile:current] autorelease]; 

Aussi, voici un exemple de données passant d'un tableView à un detailViewLoading Detail View

EDIT DE QUESTION: En utilisant l'exemple ci-dessus:

aLabel.text = [dict [email protected]"description"]; 
1

Plists sont vraiment utiles pour de nombreux cas:

+ (NSMutableDictionary*) containerDictionary { 

    NSString *path = [[NSBundle mainBundle] bundlePath]; 
    NSString *finalPath = [path stringByAppendingPathComponent:@"ContainerGraphics.plist"]; 
    NSMutableDictionary *plistData = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath]; 

    return plistData; 

} 

Cette charge un fichier plist (liste de propriétés) appelée "ContainerGraphics.plist" de mon paquet d'applications.

Le fichier plist est en fait un fichier XML. Vous pouvez en créer un dans Xcode en sélectionnant "nouveau fichier" -> "resource" -> "Property list".

Vous ne dites pas vraiment ce que vous ne comprenez pas, donc s'il y a quelque chose de spécifique que vous trouvez difficile à comprendre, s'il vous plaît :) élaborer

EDIT:

Avec le plist vous post, utilisez mon approche ci-dessus pour "charger" le fichier plist. Ensuite, il est un NSDictionary de NSDictionaries ..

Donc, pour se rendre à la « Apple » dictionnaire vous allez:

NSDictionary *appleDictionary = [plistData objectForKey:@"Apple"]; 

Ce qui signifie quelque chose le long - aller dans la liste et récupérer le dictionnaire « Apple ».

Maintenant, pour obtenir les valeurs d'image et la description que vous iriez:

NSString *imagePath = [appleDictionary objectForKey:@"image"]; 
NSString *descriptionString = [appleDictionary objectForKey:@"description"]; 

C'est à peu près ce qu'il ya à faire.

Si vous avez un tableView qui doit être rempli avec ces données, il y a un problème! Les données dans un NSDictionary n'ont pas d'ordre. Vous ne pouvez donc pas simplement référencer [dictionary objectAtIndex: indexPath.row] comme vous le feriez avec un tableau de données pour un tableauView.

Ce que vous faites ensuite est d'obtenir d'abord le plistData, comme dans mon premier exemple. (faites-le dans viewDidLoad). Ensuite, vous extrayez toutes les clés du dictionnaire plistData - notez que le «dictionnaire supérieur est spécifique», «Apple», «Orange», etc. ne correspond pas aux valeurs que vous souhaitez coder en dur dans votre application. Mais, les dictionnaires à l'intérieur de ces dictionnaires sont d'ordre général, l'image, la description ...

Alors:

NSArray *allKeys = [plistData allKeys]; 

le tableau allKey contient maintenant les clés (Apple, Orange, etc.) pour obtenir les NSDictionaries dans le plistData.

Dans la méthode cellForRowAtIndexPath vous pouvez maintenant aller:

NSDictionary *dictionaryForCurrentCell = [plistData objectForKey:[allKeys objectAtIndex:indexPath.row]]; 
[cell.textLabel setText:[dictionaryForCurrentCell objectForKey:@"image"]]; 
[cell.detailLabel setText:[dictionaryForCurrentCell objectForKey:@"description"]]; 

Hope it helps :)