2

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;

}

そして、私が持っているdidloadを表示します

- (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に渡すことです。

4

1 に答える 1

1

detailこの方法では値が一時的になるため、メソッドに変数を設定することはできませんcellForRowAtIndexPath:。これは、ユーザーがクリックする開示ボタンではなく、ユーザーがテーブルをスクロールする方法に依存します。

この行を移動します

detail = [terms objectAtIndex:indexPath.row];

問題を解決するためdidSelectRowAtIndexPath:の呼び出しの前に。performSegueWithIdentifier:これで、呼び出しdetailの直前のユーザーのクリックに応答してが設定されprepareForSegue:、正しい値が詳細データとともにViewControllerに渡されることを確認します。

于 2013-03-04T21:01:07.897 に答える