需要帮助阅读目标 c 中的 plist 文件
Posted
技术标签:
【中文标题】需要帮助阅读目标 c 中的 plist 文件【英文标题】:need help reading plist file in objective c 【发布时间】:2013-03-04 00:52:13 【问题描述】:我一直在尝试从 plist 文件中读取数据。这就是它的结构
|term|detail(string)|
我的属性:
@property (nonatomic, strong) NSDictionary *terms;
@property (nonatomic, strong) NSArray *termKeys;//this is just a array to keep track
@property (nonatomic, strong) NSString *detail;
这是我访问 cellForRowAtIndexPath 中详细信息的方式
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
NSString *currentTermsName = [termKeys objectAtIndex :[indexPath row]];
[[cell textLabel] setText:currentTermsName];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
detail = [terms objectForKey:[termKeys objectAtIndex:indexPath.row]];
NSLog(@" bombs %@",terms[@"Bomb Threats"]);
return cell;
在视图中我有
- (void)viewDidLoad
[super viewDidLoad];
NSString *myfile = [[NSBundle mainBundle]
pathForResource:@"terms" ofType:@"plist"];
terms = [[NSDictionary alloc] initWithContentsOfFile:myfile];
termKeys = [terms allKeys];
它访问值,但它为每个对象存储相同的值 假设我在 plist 中有 5 条不同的记录,如果我打印详细信息,它会显示相同的记录 5 次。
Once detail is set then I pass it to detialView
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if([segue.identifier isEqualToString:@"detailsegue"])
TermsDetailViewController *controller = (TermsDetailViewController *)segue.destinationViewController;
controller.detailTerm = detail;
这是我的字典: http://pastebin.com/bxAjJzHp
【问题讨论】:
你是什么意思“它为每个对象存储相同的”? 假设我在 plist 中有 5 条不同的记录,如果我打印detail
它会显示相同的记录 5 次
我猜你应该使用这个:detail = [ [ terms objectForKey:@"termKeys objectAtIndex:indexPath.row ] ] objectForKey:@"detail" ]
【参考方案1】:
您不需要保留属性的详细信息,因为它会随着您滚动 tableView 而不断变化,并且代码是在 cellForRowAtIndexPath: 中编写的。
尝试实现以下代码。
- (void)viewDidLoad
//Path of plist from bundle
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plistFil" ofType:@"plist"];
//Since your plist's root is a dictionary else you should form NSArray from contents of plist
self.terms = [NSDictionary dictionaryWithContentsOfFile:plistPath];
self.termKeys = [self.terms allKeys];
[self.tableView reloadData];
//As you have a key for "Bomb Threats" in your plist,try logging if it successfully initialized with values of plist
NSLog("%@",terms[@"Bomb Threats"]);
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsForSection:(NSInteger)section
return [self.termkeys count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//Initialize cell
NSString *key = self.termKeys[indexPath.row];
NSString *value = self.terms[key];
cell.textLabel.text = key;
cell.detailTextLabel.text = value;
return cell;
编辑:
//如果segues直接来自单元格,请尝试使用这个
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if([segue.identifier isEqualToString:@"detailsegue"])
TermsDetailViewController *controller = (TermsDetailViewController *)segue.destinationViewController;
NSIndexPath *indexPath = [ self.tableView indexPathForCell:sender];
NSString *key = self.termKeys[indexPath.row];
self.detail = self.terms[key];
controller.detailTerm = self.detail;
【讨论】:
NSLog("@ %@",terms[@"Bomb Threats"]);
打印正确的文本,但将 value
传递给 detail
给我同样的问题
能否展示tableView:cellForRowAtIndexPath: 方法的实现?
在这里您将详细信息的值设置为属性详细信息。它只会包含最后存储的值。您在哪里使用存储在 self.detail 中的值?
我将它传递给一个详细视图控制器的 segue
+1 这很接近了,请让我知道我应该如何继续,以便我可以接受你的问题【参考方案2】:
我就是这样,
NSString *plistFile = [[NSBundle mainBundle] pathForResource:@"myPlist" ofType:@"plist"];
NSDictionary *terms = [NSDictionary dictionaryWithContentsOfFile:plistFile];
NSLog(@"%@", [terms objectForKey:@"term1"]);
在您的代码中, 如果
termKeys = [terms allKeys];
那么这应该返回正确的值,
detail = [terms objectForKey:[termKeys objectAtIndex:indexPath.row]];
【讨论】:
我没有objectforkey@"term1" 怎么添加? 这只是一个例子,您应该使用您的术语名称。你没试过打印你的字典吗?请打印它 NSLog(@"%@", terms);然后在这里发布输出...【参考方案3】:试试这个
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
NSString *strPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
strPath = [strPath stringByAppendingPathComponent:@"fileName.plist"];
NSMutableDictionary *terms = [NSMutableDictionary dictionaryWithContentsOfFile:strPath];
NSArray *arrTemp =[terms allKeys];
arrTemp = [arrTemp sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSString *detail = [terms objectForKey:[termKeys objectAtIndex:indexPath.row]];
cell.textLabel.text = detail;
return cell;
【讨论】:
以上是关于需要帮助阅读目标 c 中的 plist 文件的主要内容,如果未能解决你的问题,请参考以下文章
需要帮助来快速搜索 iOS 属性列表 (plist) 的价值?