在DetailView中使用plist

时间:2010-12-14 20:40:00

标签: iphone sdk plist tableview

我在我的应用程序中有这个tableview,它有一个特定的项目名称,如“Apple”。当用户点击所选项目时,他们将被定向到查看该所选项目的图像和描述的detailView。我当时想用plist来做这件事,但我不知道怎么做。请帮我。

我查看了一些来源,例如iCodeBlog,但他们并没有真正解释检索和保存这么好。也许你们人们也可以参考一些更好地描述这一点的链接。

这是我试过的一个plist。每个项目(Orange,Apple)都有我想在detailView中显示的数据。我基本上想要显示所显示的数据。

alt text

4 个答案:

答案 0 :(得分:2)

这是一个示例视图控制器,可以执行您想要的操作。我将类命名为DetailViewController,并从应用程序资源中的Details.plist中加载了plist。图片也位于应用的资源中。

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

然后,您所要做的就是在加载视图之前更新selectedItem属性,并创建一个NIB文件,其描述标签和图像视图附加到其出口。

答案 1 :(得分:1)

NSString传递给详细信息视图并根据NSString加载项目。这可以是特定的字典名称,也可以是数组中的项目。

newDetailViewController.currentItem = @"Array1";

在我的详细视图中,定义:

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

现在,您的detailView控制器中的currentItem将是“Array1”,因为这是我们传递给它的。

这完全取决于你的plist是如何设置的,你使用的是NSArrayNSDictionary吗?

有很多方法可以使用它:

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

编辑问题: 使用上面的例子:

aLabel.text = [dict objectForKey@"description"];

答案 2 :(得分:1)

Plists在很多情况下非常有用:

+ (NSMutableDictionary*) containerDictionary {

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

    return plistData;

}

从我的应用包中加载一个名为“ContainerGraphics.plist”的plist文件(Property List)。

plist文件实际上只是一个XML文件。您可以通过选择“新文件” - &gt;在Xcode中构建一个。 “资源” - &gt; “财产清单”。

你并没有真正说出你不明白的是什么,所以如果有一些你难以理解的具体内容,请详细说明:)

编辑:

使用你发布的plist,使用我的上述方法“加载”plist文件。 然后它是NSDictionaries的NSDictionary ..

所以要去“Apple”字典:

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

这意味着什么 - 进入列表并检索“Apple”字典。

现在要获取图像和描述值:

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

这几乎就是它的含义。

如果您有一个需要使用此数据填充的tableView,则会有一个问题! NSDictionary中的数据没有订单。因此,您不能像对tableView的数据数组那样引用[dictionary objectAtIndex:indexPath.row]。

然后你要做的就是先得到plistData,就像我的第一个例子一样。 (在viewDidLoad中执行此操作)。 然后从plistData字典中提取所有键 - 注意“顶级字典是特定的”,Apple,“Orange”等,而不是您想要硬编码到应用程序中的值。但是,这些词典中的词典是一般的,图像,描述......

所以:

NSArray *allKeys = [plistData allKeys];

allKey数组现在包含要访问plistData中的NSDictionaries的键(Apple,Orange等)。

在cellForRowAtIndexPath方法中,您现在可以:

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

希望有所帮助:)

答案 3 :(得分:0)

在plist中创建一个数组,其中包含多个等于行数的项。在每个项目中创建一个名为description的字符串和一个名为image的字符串。获取didSelectRowAtIndex:方法中所选行的编号。将字典存储在NSDictionary

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

然后通过调用

获取imagestring和描述字符串

[myDictionary objectForKey:@"image"]

并将这些字符串传递给详细视图。