将原型单元与 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 连接起来的主要内容,如果未能解决你的问题,请参考以下文章