将原型单元与 xcode 4 中的 plist 连接起来

Posted

技术标签:

【中文标题】将原型单元与 xcode 4 中的 plist 连接起来【英文标题】:Connect a prototype cell with a plist in xcode 4 【发布时间】:2012-06-14 19:02:57 【问题描述】:

我正在制作我的第一个 iphone 应用程序,它是一个葡萄酒图表应用程序。它与 xcode 4.2 中的故事板一起使用。它基于一个带有 4 个选项卡的选项卡栏:信息、葡萄酒图表、搜索、收藏夹。我现在正在制作葡萄酒图表,在这个选项卡中,我放置了一个带有原型单元格的 TableView,我想用葡萄酒的名称、地区和图像填充这个单元格。到目前为止,我已经这样做了:

1:将第二个选项卡链接到导航控制器

2:将导航控制器链接到TableView(WinesViewController)

3:创建了 WinesViewController.h/.m 类

4:添加了一个带有标识符的原型单元格:wineCell 以及带有文本的标题和副标题标签:名称和地区。

5:创建一个包含所有瓶子WineName.png图像的文件夹

6:创建了一个 plist:Wine.plist,每个酒都有 1 个字典,字典键 = 酒名。字典包含 19 个字符串,键为“Name”、“District”、“Image”、“Acid level”等。

这是列表:

http://www.flickr.com/photos/80427098@N07/7372450200/in/photostream

这就是我到目前为止所做的一切,现在我想用 plist 中的字符串填充 tableview 中的单元格标签,按字母顺序按部分排序。我是新手,所以我不知道要使用哪些代码以及将它们放在哪里。有人可以帮助我更多地了解如何使用 plist 中的信息填充 tableview 吗?

有人告诉我,我不应该将代码直接放在 WinesViewController.h/.m 中。然后我被告知我可以创建一个 NSObject 的子类(我们称之为 WineObject.h/.m),在这里放一些 NSDictionary / NSEnumerator 代码,然后以某种方式将其链接到 WinesViewController 原型单元。但我真的不知道怎么做!我还没有那么有经验!我真的希望有人可以帮助我解决代码,将它们放在哪里以及如何将它们链接起来。那将是太棒了。我现在开始有点了解 X-Code 和 Objective C 编码(终于!),但这还很先进,现在我被困住的一些帮助会给我很多工作!对有用的教程、示例项目等的指导也值得赞赏。

如果您需要了解更多信息才能回答我的问题,请告诉我!我没有在 WinesViewController 或 WineObject 中编写任何代码,所以我真的需要完整的解释..

稍后我将在 DetailViewController 中使用来自同一 plist 的信息(包含葡萄酒信息的全屏视图),这就是为什么当我在 tableview 单元格中只使用 3 个值时 plist 中有这么多字符串的原因。搜索功能也将基于此 plist 中的数据进行。感谢您提供所有有用的帮助!

【问题讨论】:

【参考方案1】:

您应该首先阅读有关如何在 Objective-C 中使用 model-view-controller 范式的信息。这将解释如何将您的数据与该数据的视图分开。一旦你理解了这一点,你就能更好地理解其余的内容。

我建议对您的 plist 文件进行一项更改。与其让顶层成为一个字典,其中每个酒名都是一个键,每个键的值是一个包含有关酒的信息的字典,我会让顶层成为一个字典数组。每一种酒都将是数组中的一个元素,并且将是一个字典,其中包含您当前拥有的所有信息以及酒的名称。这将更接近于您的数据模型的外观。像这样的:

<array>
    <dict>
        <key>Name</key>
        <string>J. P. Chenet Merlot</string>
        <key>Image</key>
        <string>JPChenet.png</string>
        ... the rest of the keys and values for this wine ...
    </dict>

    <dict>
        <key>Name</key>
        <string>Campo Viejo Crianza</string>
        ... the rest of the keys ...
    </dict>
</array>

每个 wine 对象都将包含字典中每个元素的实例变量。 (所以一个用于图像,一个用于名称,一个用于区域,等等。)像这样的:

@class WineObject : NSObject  
    NSString* name;
    NSString* imagePath;
    NSString* district;
    // ... etc.
;

您的模型可能只是WineObjects 中的NSArray。您可以使用我在其他问题中提到的方法从 plist 中读取对象。它看起来像这样:

NSMutableArray* wineModel = [[NSMutableArray alloc] init];
NSArray* wines = [NSArray arrayWithContentsOfURL:<url of the plist file>];
NSEnumerator* wineEnum = [wine objectEnumerator];
NSDictionary* nextWine = nil;
while ((nextWine = [wineEnum nextObject]) != nil)

    // Get the wine data from the dictionary
    WineObject* newWine = [WineObject wineWithDictionary:nextWine];

    // Add the next wine to our model
    [wineModel addObject:newWine];

你的WineObject 类将有一个类似这样的类初始化器:

+ (id)wineWithDictionary:(NSDictionary*)wineDict

    name = [wineDict objectForKey:@"Name"];
    district = [wineDict objectForKey:@"District"];
    imagePath = [wineDict objectForKey:@"Image"];
    // ... extract the rest of the values from the dictionary ...

【讨论】:

谢谢你一百万次,我现在会解决这个问题并在我完成后发布我的解决方案!

以上是关于将原型单元与 xcode 4 中的 plist 连接起来的主要内容,如果未能解决你的问题,请参考以下文章

将原型单元连接到视图控制器 [Swift 4]

Xcode:如何测试主包 .plist 文件内容?

递增动态原型使 XCode 4.5.1 崩溃

使用故事板将原型单元连接到不同的场景

我在模拟器中运行应用程序后,xcode 中的原型单元格不显示

使用 Xcode 读取和写入具有字典数组的 Plist