我一直在尝试从plist文件中读取数据。这就是它的结构
|term|detail(string)|
我的属性:
@property (nonatomic, strong) NSArray *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 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次。
设置细节后,我将其传递给detialView
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"detailsegue"]){
TermsDetailViewController *controller = (TermsDetailViewController *)segue.destinationViewController;
controller.detailTerm = detail;
}
}
最后:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"detailsegue" sender:self];
}
这是我的词典:http://pastebin.com/bxAjJzHp
目标是将详细信息传递给detailviewcontroller,就像主/详细示例项目一样。
答案 0 :(得分:1)
您无法在detail
方法中设置cellForRowAtIndexPath:
变量,因为这样会使值变为瞬态:它取决于用户如何滚动表格,而不是用户点击的公开按钮。
移动此行
detail = [terms objectAtIndex:indexPath.row];
在调用didSelectRowAtIndexPath:
之前到performSegueWithIdentifier:
以解决问题。现在设置detail
是为了响应用户在prepareForSegue:
调用之前的点击,确保使用详细信息数据将正确的值传递给视图控制器。