如何读取plist文件然后填充UItableView?

时间:2013-03-04 20:52:23

标签: ios objective-c uitableview plist

我一直在尝试从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,就像主/详细示例项目一样。

1 个答案:

答案 0 :(得分:1)

您无法在detail方法中设置cellForRowAtIndexPath:变量,因为这样会使值变为瞬态:它取决于用户如何滚动表格,而不是用户点击的公开按钮。

移动此行

detail = [terms objectAtIndex:indexPath.row];
在调用didSelectRowAtIndexPath:之前

performSegueWithIdentifier:以解决问题。现在设置detail是为了响应用户在prepareForSegue:调用之前的点击,确保使用详细信息数据将正确的值传递给视图控制器。